Title: ????? (Inheritance and Polymorphism)
1?????(Inheritance and Polymorphism)
- ???
- ??????
- ??????/???????/
- ???????????
2??
- ??
- ???protected
- ????
- ????????????
- OCP??-????
- ??
- ?????
- ????????0.1?
3??
- ????System.Object
- LSP Liskov?????
- ????
- DIP ???????
- ??
- ISP ??????
- ????
- ??????
4??
- ??
- ???protected
- ????
- ????????????
- OCP??-????
- ??
- ?????
- ????????0.1?
5UsingInheritance.Calculator ??
- public int Add(int a, int b)
- int result a b
- return result
-
- public int Subtract(int a, int b)
-
- int result a - b
- return result
-
- public int Multiply(int a, int b)
-
- int result a b
- return result
6UsingInheritance.Program.Main ??(1/2)
- switch (op)
-
- case
- result AdvancedCalculator.Add(operand1,operand
2) - Console.WriteLine("0 1 2 ",
- operand1, operand2, result)
- break
- . . .
7UsingInheritance.Program.Main ??(2/2)
- case
- result
- AdvancedCalculator.Power(operand1, operand2)
- Console.WriteLine( " 0 1 2",
- operand1, operand2, result)
- break
- . . .
8UsingInheritance.AdvancedCalculator ??
- class AdvancedCalculator Calculator
-
- public static int Power(int a, int b)
-
- int result (int)Math.Pow(a, b)
- return result
-
9?????UML???
10?????????
- class A
- private int data1
- private int data2
- //other members are methods
-
- class B A
- private int data3
- //other members are methods
-
- class C B
- private int data1
- private int data4
- //other members are methods
11?????????
A a new A() B b new B() C c new C()
data1
a
data2
c
data1
data1
b
data2
data2
data3
data3
data1
data4
12DataMemberInheritance.A
- class A
- private int data1
- private int data2
- public A()
- data1 1
- data2 2
-
- public void GetAData(out int data1, out int
data2) - data1 this.data1
- data2 this.data2
-
13DataMemberInheritance.B
- class B A
- private int data3
- public B()
- data3 3
-
- public void GetBData(out int data3)
- data3 this.data3
-
14DataMemberInheritance.C
- class C B
- private int data1
- private int data4
- public C()
- data1 5
- data4 4
-
- public void GetCData(out int data1, out int
data4) - data1 this.data1
- data4 this.data4
-
15DataMemberInheritance.Program.Main ?? (1/2)
- A a new A()
- B b new B()
- C c new C()
- a.GetAData(out data1, out data2)
- Debug.Assert(data1 1 data2 2)
- b.GetAData(out data1, out data2)
- Debug.Assert(data1 1 data2 2)
- b.GetBData(out data3)
- Debug.Assert(data3 3)
- c.GetAData(out data1, out data2)
- Debug.Assert(data1 1 data2 2)
16DataMemberInheritance.Program.Main ?? (2/2)
- c.GetBData(out data3)
- Debug.Assert(data3 3)
- c.GetCData(out data1, out data4)
- Debug.Assert(data1 5 data4 4)
17MemberFunctionInheritance.A
- class A
- private int data1
- private int data2
- public A()
- data1 1
- data2 2
-
- public int GetData1()
- return data1
-
- public int GetData2()
- return data2
-
18MemberFunctionInheritance.B
- class B A
- private int data3
- public B()
- data3 3
-
- public int Data3
- get return data3
-
- public int GetSum()
- return (GetData2() data3)
-
19MemberFunctionInheritance.C (1/2)
- class C B
- private int data1
- private int data4
- public C()
- data1 5
- data4 4
-
- public new int GetData1()
- return data1
-
-
20MemberFunctionInheritance.C (2/2)
- public int GetData4()
- return data4
-
- public int GetAData1()
- return base.GetData1()
-
21MemberFunctionInheritance.Program.Main?? (1/2)
- A a new A()
- B b new B()
- C c new C()
- data1 a.GetData1()
- data2 a.GetData2()
- Debug.Assert(data1 1 data2 2)
- data1 b.GetData1()
- data2 b.GetData2()
- data3 b.Data3
- Debug.Assert(data1 1 data2 2 data3
3) -
22MemberFunctionInheritance.Program.Main?? (2/2)
- int sum b.GetSum()
- Debug.Assert(sum 5)
- data1 c.GetData1()
- data2 c.GetData2()
- data3 c.Data3
- data4 c.GetData4()
- int aAData1 c.GetAData1()
- Debug.Assert(data1 5 data2 2
- data3 3 data4 4
- aAData1 1)
23??
24??
- ??
- ???protected
- ????
- ????????????
- OCP??-????
- ??
- ?????
- ????????0.1?
25CalculatorInheritance???
26CalculatorInheritance.Program.Main??
- Calculator c new Calculator()
- c.Run()
- AdvancedCalculator ac new AdvancedCalculator()
- ac.Run()
27CalculatorInheritance.Calculator??
- protected int register1
- protected int register2
- protected int display
- protected char op
- public Calculator()
- register1 0
- register2 0
- display 0
- op ''
28CalculatorInheritance.Calculator.Run?? (1/2)
- Console.WriteLine("Calculator")
- while(true)
- Console.Write("Turning off? (Y/N) ")
- answer char.Parse(Console.ReadLine())
- if( answer 'Y' answer 'y' ) break
- Console.Write("Enter operand 1 ")
- register1 int.Parse(Console.ReadLine())
- Console.Write(
- "Enter operator , -, , / ")
- op char.Parse(Console.ReadLine())
- Console.Write("Enter operand 2 ")
- register2 int.Parse(Console.ReadLine())
29CalculatorInheritance.Calculator.Run?? (2/2)
- switch (op)
- case ''
- Add()
- break
- case '-'
- Subtract()
- break
- . . . . . .
- default
- Console.WriteLine(
- "Should not see this message. Debug!!!")
- break
-
- Console.WriteLine(display)
-
30CalculatorInheritance.Calculator??
- protected void Add()
- display register1 register2
-
- protected void Subtract()
- display register1 - register2
-
- protected void Multiply()
- display register1 register2
-
- protected void Divide()
- display register1 / register2
31CalculatorInheritance.AdvancedCalculator (1/3)
- class AdvancedCalculator Calculator
- public new void Run()
- Console.WriteLine("Advanced Calculator")
- while(true)
- Console.Write("Turning off? (Y/N) ")
- answer char.Parse(Console.ReadLine())
- if( answer 'Y' answer 'y' )
- break
- Console.Write("Enter operand 1 ")
- register1int.Parse(Console.ReadLine())
- Console.Write(
- "Enter operator , -, , /, ")
- op char.Parse(Console.ReadLine())
-
32CalculatorInheritance.AdvancedCalculator (2/3)
- Console.Write("Enter operand 2")
- register2int.Parse(Console.ReadLine())
- switch (op)
- . . . . . .
- case ''
- Power()
- break
- default
- . . . . . .
-
- Console.WriteLine(display)
-
33CalculatorInheritance.AdvancedCalculator (3/3)
- protected void Power()
- display (int) Math.Pow(register1,
- register2)
-
-
34??
- ??
- ???protected
- ????
- ????????????
- OCP??-????
- ??
- ?????
- ????????0.1?
35SealedClassExample.Parent
- sealed class Parent
- private int data1
- public Parent()
- data1 0
-
- public int Data1
- get return data1
-
36SealedClassExample.Child
- class Child Parent // Error!
-
- private int data2
- public Child()
- data2 0
-
- public int Data2
- get return data2
-
37??
- ??
- ???protected
- ????
- ????????????
- OCP??-????
- ??
- ?????
- ????????0.1?
38UsingConstructorsForInheritance.Program.Main ??
- Animal slug new Animal()
- Animal tweety new Animal( "canary" )
- Primate godzilla new Primate()
- Primate human new Primate( 4 )
- Human jill new Human()
39UsingConstructorsForInheritance.Animal
- class Animal
-
- private string species
- public Animal()
-
- Console.WriteLine("Animal()")
- species "Animal"
-
- public Animal( string s )
-
- Console.WriteLine("Animal(" s ")")
- species s
-
40UsingConstructorsForInheritanc.Primate
- class Primate Animal
-
- private int heartCham
- public Primate() base()
-
- Console.WriteLine( "Primate()" )
-
- public Primate( int n ) base( "Primate" )
-
- Console.WriteLine("Primate(" n ")")
- heartCham n
-
41UsingConstructorsForInheritanc.Human
- class Human Primate
-
- public Human() base( 4 )
-
- Console.WriteLine( "Human()" )
-
-
42????????
Primate human new Primate( 4 )
public Primate( int n ) base( "Primate" )
. . .
public Animal( string s ) . . .
43??
- ???????????UsingConstructorsForInheritance
44??
- ??
- ???protected
- ????
- ????????????
- OCP??-????
- ??
- ?????
- ????????0.1?
45??-????(OCPOpen-Closed Principle)
- Software entities (classes, modules, functions,
etc.) should be open for extension, but closed
for modification - ?????????,???????????????
Robert C. Martin, Agile Software Development
Principles, Patterns, and Practices, Pearson
Education, 2003
46??OCPViolationExample???
47OCPViolationExample.Program.Main??
- Point center
- center.x 15
- center.y 20
- Point topLeft
- topLeft.x 30
- topLeft.y 40
- Shape list new Circle(2, center),
- new Rectangle(3, 4, topLeft)
- DrawAllShapes(list)
48OCPViolationExample.Program.DrawAllShapes
- static void DrawAllShapes(Shape list)
- for (int i 0 i lt list.Length i)
- Shape s listi
- switch (s.type)
- case ShapeType.CIRCLE
- DrawCircle((Circle) s)
- break
- case ShapeType.RECTANGLE
- DrawRectangle((Rectangle) s)
- break
-
-
49OCPViolationExample.Program.DrawCircle?DrawRectang
le
- static void DrawCircle(Circle c)
-
- Console.WriteLine("Draw a circle")
-
- static void DrawRectangle(Rectangle r)
-
- Console.WriteLine("Draw a rectangle")
50OCPViolationExample
- class Shape
- public ShapeType type
- public Shape(ShapeType t)
- type t
-
-
- class Circle Shape
- private int radius
- private Point center
- public Circle(int radius, Point center)
- base(ShapeType.CIRCLE)
- this.radius radius
- this.center center
-
51OCPViolationExample.Rectangle
- class Rectangle Shape
-
- private int width
- private int height
- private Point topLeft
- public Rectangle(int width, int height,
- Point topLeft)
- base(ShapeType.RECTANGLE)
-
- this.width width
- this.height height
- this.topLeft topLeft
-
52OCPViolationExample?????
- ??????Shape???(??,???????????)???????switch??
- ??????Shape???,????enum??????switch??,????Program?
????Draw??
53??
- ??
- ???protected
- ????
- ????????????
- OCP??-????
- ??
- ?????
- ????????0.1?
54?????????
- ??(packaging)
- ??(inheritance)
- ??(polymorphism)
55??
- ?????(compile-time binding)??????(run-time
binding) - ????(static binding)?????(dynamic binding)
- ?????
- ??????
- ??(virtual)???(override)
- ???????
- ??????
56DrawingAllShapes???
57DrawingAllShapes.Program.Main??(1/2)
- Shape list new Shape2
- Point center
- center.x 15
- center.y 20
- Point topLeft
- topLeft.x 30
- topLeft.y 40
- Circle c new Circle(2, center)
- Rectangle r new Rectangle(3, 4, topLeft)
- Console.WriteLine("??????, ??")
- Console.WriteLine("1 ??, ??")
- Console.WriteLine("2 ??, ??")
- int ans int.Parse(Console.ReadLine())
58DrawingAllShapes.Program.Main??(2/2)
- switch (ans)
-
- case 1
- list0 c
- list1 r
- break
- case 2
- list0 r
- list1 c
- break
- default
- . . .
-
- DrawAllShapes(list)
59DrawingAllShapes.Program.DrawAllShapes
- static void DrawAllShapes(Shape list)
-
- int i
- for (i 0 i lt list.Length i)
-
- listi.Draw()
-
60DrawingAllShapes.Shape
- class Shape
-
- public Shape()
- virtual public void Draw()
61DrawingAllShapes.Circle
- class Circle Shape
-
- private int radius
- private Point center
- public Circle(int radius, Point center)
-
- this.radius radius
- this.center center
-
- override public void Draw()
-
- Console.WriteLine("Draw a circle")
-
-
62DrawingAllShapes.Rectangle
- class Rectangle Shape
- private int width
- private int height
- private Point topLeft
- public Rectangle(int width, int height,
- Point topLeft)
- this.width width
- this.height height
- this.topLeft topLeft
-
- override public void Draw()
- Console.WriteLine("Draw a rectangle")
-
63DrawingAllShapes????
?????
?????
c
this
Circle.Draw
c.radius
c.center.x
r
c.center.y
this
Rectangle.Draw
r.width
r.height
r.topLeft.x
r.topLeft.y
64??
- ???DrawingAllShapes????Triangle,???????????
65??
- ??
- ???protected
- ????
- ????????????
- OCP??-????
- ??
- ?????
- ????????0.1?
66NewVsOverride.Program???
67NewVsOverride.Car
- // Define the base class
- class Car
-
- public virtual void DescribeCar()
-
- System.Console.WriteLine(
- "Four wheels and an engine.")
-
-
-
68NewVsOverride.ConvertibleCar
- // Define the derived classes
- class ConvertibleCar Car
-
- public new virtual void DescribeCar()
-
- base.DescribeCar()
- Console.WriteLine(
- "A roof that opens up.")
-
69NewVsOverride.Minivan
- class Minivan Car
-
- public override void DescribeCar()
-
- base.DescribeCar()
- Console.WriteLine(
- "Carries seven people.")
-
70NewVsOverride.Program.Main?? (1/2)
- // new and override make no differences here
- Car car1 new Car()
- car1.DescribeCar()
- Console.WriteLine("----------")
- ConvertibleCar car2 new ConvertibleCar()
- car2.DescribeCar()
- Console.WriteLine("----------")
- Minivan car3 new Minivan()
- car3.DescribeCar()
- Console.WriteLine("----------")
71UsingBase.Program.Main?? (2/2)
- // they are different in polymorphysm
- Car cars new Car3
- cars0 new Car()
- cars1 new ConvertibleCar()
- cars2 new Minivan()
- foreach (Car vehicle in cars)
-
- Console.WriteLine("Car object "
- vehicle.GetType())
- vehicle.DescribeCar()
- Console.WriteLine("----------")
72?????
- ?? override
- ????Polymorphism (??)
- ?????
- ?? new
- ??????????????????
- ???????
73??
74??
- ??
- ???protected
- ????
- ????????????
- OCP??-????
- ??
- ?????
- ????????0.1?
75BlackJack_0_1 ???
76BlackJack_0_1.BlackJackTest ??(1/2)
- public static bool Scenario1_OK()
-
- Card cards new Card(Suit.SPADE, 1),
- new Card(Suit.HEART, 11),
- new Card(Suit.DIAMOND, 10)
-
- Deck deck new Deck(cards)
- Player player new Player()
- Dealer dealer new Dealer()
-
77BlackJack_0_1.BlackJackTest ??(2/2)
- player.SaveACard(deck.DealACard())
- dealer.SaveACard(deck.DealACard())
- player.SaveACard(deck.DealACard())
- return(
- player.GetStatus() Status.BLACK_JACK
- dealer.GetStatus() Status.PASS)
78BlackJack_0_1.Game ?? (1/6)
- const int N_PLAYERS 2
- Deck deck
- Player players new PlayerN_PLAYERS
- public Game()
-
- players0 new Player("Jeng")
- playersN_PLAYERS-1 new Dealer()
79BlackJack_0_1.Game ?? (2/6)
- private void Play()
-
- int i
- // ?????
- for (i 0 i lt N_PLAYERS i)
-
- playersi.SaveACard(
- deck.DealACard())
- playersi.Dump()
-
80BlackJack_0_1.Game ?? (3/6)
- // ?????
- for (i0 i lt N_PLAYERS i)
-
- playersi.SaveACard(
- deck.DealACard())
- playersi.Dump()
-
81BlackJack_0_1.Game ?? (4/6)
- // ??????
- for(i0 iltN_PLAYERS i)
-
- while (playersi.GetStatus()
- Status.PASS
- playersi.WantOneMoreCard()
- deck.HasMoreCard())
-
- playersi.SaveACard(deck.DealACard())
- playersi.Dump()
- if(IsBlackJackOrBurst(playersi))
- return
-
-
82BlackJack_0_1.Game ?? (5/6)
- // ?????
- Player dealer playersN_PLAYERS-1
- for(i0 iltN_PLAYERS-1 i)
- if (dealer.GetTotalPoints() gt
- playersi.GetTotalPoints())
- Console.WriteLine( dealer.Name
- "?"playersi.Name)
- else
- Console.WriteLine(
- playersi.Name"?"dealer.Name)
-
-
-
83BlackJack_0_1.Game ?? (6/6)
- private bool IsBlackJackOrBurst(
- Player player)
- bool isBlackJack false
- if (player.GetStatus()Status.BLACK_JACK)
- isBlackJack true
- Console.WriteLine(player.Name
- " BlackJack!!!")
-
- bool isBurst false
- if (player.GetStatus() Status.BURST)
- isBurst true
- Console.WriteLine(player.Name" ?!!!")
-
- return (isBlackJack isBurst)
84BlackJack_0_1.Player ??(1/5)
- private Card hand new Card11
- private int nCards
- private Status status
- private int totalPoints
- private string name
- public Player()
-
- nCards 0
- name "???"
-
-
85BlackJack_0_1.Player ??(2/5)
- public Player(string name)
-
- nCards 0
- this.name name
-
- public string Name
-
- get return name
-
-
86BlackJack_0_1.Player ??(3/5)
- virtual public bool WantOneMoreCard()
-
- Console.Write("??????? (y/n) ")
- string answer Console.ReadLine()
- return (answer "Y" answer "y")
87BlackJack_0_1.Player ??(4/5)
- public void Dump()
-
- int i
- Console.Write(name" ? ")
- for (i 0 i lt nCards i)
-
- handi.Dump()
- Console.Write("\t")
- if ((i 1) 5 0)
- Console.WriteLine()
-
88BlackJack_0_1.Player ??(5/5)
- Console.WriteLine()
- Console.WriteLine(name " ??? "
- totalPoints)
89BlackJack_0_1.Dealer??
- class Dealer Player
- public Dealer() base("??")
- override public bool WantOneMoreCard()
-
- return (base.GetTotalPoints() lt 17)
-
90??
- ????System.Object
- LSP Liskov?????
- ????
- DIP ???????
- ??
- ISP ??????
- ????
- ??????
91????System.Object
- ?????
- ????
- Equals
- GetHashCode
- GetType
- ReferenceEquals
- ToString
- Finalize
92InheritingObject.Program.Main??
- Test t1 new Test()
- Test t2 new Test()
- bool isEqual t1.Equals(t2)
- Console.WriteLine(t1.ToString())
- Console.WriteLine("t1 ?t2 ???" isEqual)
93InheritingObject.Test
- class Test
-
- override public string ToString()
-
- return "??InheritingObject.Test"
-
94Boxing ? Unboxing
- int x 10
- Object obj (Object) x // boxing
- obj 20
- int j (int)obj // unboxing
95??
- ????System.Object
- LSP Liskov?????
- ????
- DIP ???????
- ??
- ISP ??????
- ????
- ??????
96Liskov ?????(LSP Liskov Substitution Principle)
- Subtype must be substitutable for their base
types - ???????
- ???S?????o1,???T???o2,????????T?????P?,P??????o1??
o2??? - ??LSP????OCP
Robert C. Martin, Agile Software Development
Principles, Patterns, and Practices, Pearson
Education, 2003
97IS-A ?????
98LSPViolationExample.Rectangle (1/2)
- class Rectangle
-
- private int width
- private int height
- virtual public int Width
-
- set width value
-
- virtual public int Height
-
- set height value
-
99LSPViolationExample.Rectangle (2/2)
- public int Area()
-
- return width height
-
100LSPViolationExample.Square
- class Square Rectangle
-
- override public int Width
-
- set base.Width value
- base.Height value
-
- override public int Height
-
- set base.Width value
- base.Height value
-
101LSPViolationExample.Program
- class Program
-
- static void Main(string args)
-
- Square s new Square()
- Test(s)
-
- static void Test(Rectangle r)
-
- r.Width 5
- r.Height 4
- Debug.Assert(r.Area() 20)
-
102??????????
- ???????????
- Rectangle.Width?????
- Debug.Assert( (width value)
- (height old.height))
- ??LSP???????????
- ????????????????????,????
- ????????????????????,????
103??
- ????System.Object
- LSP Liskov?????
- ????
- DIP ???????
- ??
- ISP ??????
- ????
- ??????
104????
105AbstractClassExample.Program.Main() ??
- double a 5.0
- Square sq new Square(a)
- Console.WriteLine("???sq????" sq.Area())
- Circle c new Circle(a)
- Console.WriteLine("??c????" c.Area())
-
106AbstractClassExample.Shape
- public abstract class Shape
- private string shape
- public Shape(string shape)
- this.shape shape
- Console.WriteLine("??" shape)
-
- abstract public double Area()
107AbstractClassExample.Square
- public class Square Shape
-
- double a
- public Square(double a) base("???")
-
- this.a a
-
- public override double Area()
-
- return a a
-
108AbstractClassExample.Circle
- public class Circle Shape
-
- double r
- public Circle(double r) base("??")
-
- this.r r
-
- public override double Area()
-
- return Math.PI r r
-
109??
- ???DrawingAllShapes????Shape??????,??Shape.Draw()?
?????
110????
111??
- ????System.Object
- LSP Liskov?????
- ????
- DIP ???????
- ??
- ISP ??????
- ????
- ??????
112???????(DIP Dependency-Inversion Principle)
- High-level modules should not depend on low-level
modules. Both should depend on abstractions. - Abstractions should not depend on details.
Details should depend on abstractions.
Robert C. Martin, Agile Software Development
Principles, Patterns, and Practices, Pearson
Education, 2003
113????DIP???
114???(State Chart)
115DIPViolationExample.LampStatus?ButtonStatus
- public enum LampStatus
-
- OFF 0,
- ON 1
-
- public enum ButtonStatus
-
- RELEASED 0,
- PRESSED 1
116DIPViolationExample.Lamp
- public class Lamp
- private LampStatus status LampStatus.OFF
- public LampStatus Status
- get return status
-
- public void TurnOn()
- status LampStatus.ON
-
- public void TurnOff()
- status LampStatus.OFF
-
117DIPViolationExample.Button (1/2)
- public class Button
-
- private ButtonStatus status
- ButtonStatus.RELEASED
- private Lamp lamp
- public Button(Lamp lamp)
-
- this.lamp lamp
-
- public ButtonStatus Status
- get return status
-
-
118DIPViolationExample.Button (2/2)
- public void Press()
- if (status ButtonStatus.RELEASED)
- status ButtonStatus.PRESSED
- lamp.TurnOn()
-
-
- public void Release()
- if( status ButtonStatus.PRESSED )
- status ButtonStatus.RELEASED
- lamp.TurnOff()
-
-
119DIPViolationExample.Program.Main() ?? (1/3)
- Lamp lamp1 new Lamp(1)
- Button button new Button(lamp1)
- Random rand new Random()
- for (int n 0 n lt 100 n)
-
- Console.Write("time n " n "\t")
-
120DIPViolationExample.Program.Main() ?? (2/3)
- if (rand.Next() 2 1)
-
- if (button.Status
- ButtonStatus.PRESSED)
-
- button.Release()
-
- else
-
- button.Press()
-
-
121DIPViolationExample.Program.Main() ?? (3/3)
- if (lamp1.Status LampStatus.OFF)
-
- Console.WriteLine("lamp1 is off")
-
- else
-
- Console.WriteLine("lamp1 is on")
-
- Console.WriteLine()
122??
- ????System.Object
- LSP Liskov?????
- ????
- DIP ???????
- ??
- ISP ??????
- ????
- ??????
123??
124UsingInterface.Program.Main??
- double a 5.0
- Square sq new Square(a)
- Console.WriteLine("???sq????" sq.Area())
- Circle c new Circle(a)
- Console.WriteLine("??c????" c.Area())
125UsingInterface.Shape
- interface Shape
-
- double Area()
-
-
126UsingInterface.Square
- public class Square Shape
-
- double a
- public Square(double a)
-
- this.a a
-
- public double Area()
-
- return a a
-
-
127UsingInterface.Circle
- public class Circle Shape
-
- double r
- public Circle(double r)
-
- this.r r
-
- public double Area()
-
- return Math.PI r r
-
128?? vs. ???? (1/2)
- interface Shape
-
- double Area()
-
- --------------------------------------------
- public abstract class Shape
- private string shape
- public Shape(string shape)
- this.shape shape
- Console.WriteLine("??" shape)
-
- abstract public double Area()
129?? vs. ???? (2/2)
- public class Square Shape
- . . .
- public double Area()
- return a a
-
-
- --------------------------------------------
- public class Square Shape
- . . .
- public override double Area()
- return a a
-
130????DIP???
131ButtonAndLamp
- public interface SwitchableDevice
- void TurnOn()
- void TurnOff()
-
- public enum LampStatus
- OFF 0,
- ON 1
-
- public enum ButtonStatus
- RELEASED 0,
- PRESSED 1
132ButtonAndLamp.Lamp
- public class Lamp SwitchableDevice
-
- private LampStatus status LampStatus.OFF
- public LampStatus Status
- get return status
-
- public void TurnOn()
- status LampStatus.ON
-
- public void TurnOff()
- status LampStatus.OFF
-
133ButtonAndLamp.Button (1/2)
- public class Button
-
- private ButtonStatus status
- ButtonStatus.RELEASED
- private SwitchableDevice device
- public Button(SwitchableDevice device)
-
- this.device device
-
- public ButtonStatus Status
- get return status
-
134ButtonAndLamp.Button (2/2)
- public void Press()
- if (status ButtonStatus.RELEASED)
- status ButtonStatus.PRESSED
- device.TurnOn()
-
-
- public void Release()
- if (status ButtonStatus.PRESSED)
- status ButtonStatus.RELEASED
- device.TurnOff()
-
-
135??
- ???ButtonAndLamp????Fan,?Button?????Fan????
136??
- ????System.Object
- LSP Liskov?????
- ????
- DIP ???????
- ??
- ISP ??????
- ????
- ??????
137??????(ISP Interface-Segregation Principle)
- Clients should not be forced to depend on methods
that they do not use - ???????????????????
138????ISP???
139ISPViolationExample
- interface TimerClient
- void TimeOut()
-
- interface Door TimerClient
- void Lock()
- void Unlock()
- bool IsOpen()
-
- enum DoorStatus
- CLOSED 0,
- OPEN 1
140ISPViolationExample.Timer (1/2)
- class Timer
-
- private int t
- private int timeout
- private TimerClient client
- public Timer(int timeout,
- TimerClient client)
-
- this.timeout timeout
- this.client client
- t 0
-
141ISPViolationExample.Timer (2/2)
- public void Advance()
- t
- if (t timeout 0)
- client.TimeOut()
-
-
142ISPViolationExample.TimedDoor (1/2)
- class TimedDoor Door
-
- private DoorStatus status
- DoorStatus.CLOSED
- public bool IsOpen()
- return (status DoorStatus.OPEN)
-
- public void Lock()
- if (IsOpen()) status DoorStatus.CLOSED
-
- public void Unlock()
- if (!IsOpen()) status DoorStatus.OPEN
-
-
143ISPViolationExample.TimedDoor (2/2)
- public void TimeOut()
- Lock()
-
-
144ISPViolationExample.Program.Main ??(1/2)
- TimedDoor tDoor new TimedDoor()
- int timeout 10
- Timer timer new Timer(timeout, tDoor)
- int n
- const int N 20
- tDoor.Unlock()
- for (n 0 n lt N n)
-
145ISPViolationExample.Program.Main??(2/2)
- if (tDoor.IsOpen())
-
- Console.WriteLine(
- "n " n "\t tDoor is open")
-
- else
-
- Console.WriteLine(
- "n " n "\t tDoor is closed")
-
- timer.Advance()
146??
- ????System.Object
- LSP Liskov?????
- ????
- DIP ???????
- ??
- ISP ??????
- ????
- ??????
147??MultiInterface???
148MultiInterface.Program.Main??
- Floatplane fp new Floatplane()
- fp.Sail()
- fp.Fly()
149MultiInterface
- interface Plane
-
- void Fly()
-
- interface Ship
-
- void Sail()
-
-
150MultiInterface.Floatplane
- public class Floatplane Plane, Ship
- public Floatplane()
- Console.WriteLine("??????")
-
- public void Sail()
- Console.WriteLine("????")
-
- public void Fly()
- Console.WriteLine("????")
-
151??
- ??????, ?????????Clock_Radio,????Clock?GetTime()??
?Radio?PlayMusic()??
152????ISP???
153TimedDoorSimulation??
- interface TimerClient
- void TimeOut()
-
- interface Door
- void Lock()
- void Unlock()
- bool IsOpen()
-
- . . .
- class TimedDoor Door, TimerClient
-
- . . .
154??
- ????System.Object
- LSP Liskov?????
- ????
- DIP ???????
- ??
- ISP ??????
- ????
- ??????
155??CastMultiInterfaces???
156CastMultiInterfaces.Program.Main??
- double a 5.0
- Square sq new Square(a)
- Rhombus rhomb sq as Rhombus
- Console.WriteLine(
- "sq???????????"rhomb.Area() )
- if( sq is Rectangle )
-
- Rectangle rec (Rectangle) sq
- Console.WriteLine(
- "sq???????????"rec.Area() )
-
157CastMultiInterfaces
- interface Rectangle
-
- double Area()
-
- interface Rhombus
-
- double Area()
-
-
158CastMultiInterfaces.Square (1/2)
- public class Square Rectangle, Rhombus
-
- private double a
- private double d
- public Square(double a)
-
- this.a a
- d Math.Sqrt(2.0) a
-
-
-
159CastMultiInterfaces.Square (2/2)
- double Rectangle.Area()
-
- return a a
-
- double Rhombus.Area()
-
- return 0.5 d d
-
-