????? (Inheritance and Polymorphism) - PowerPoint PPT Presentation

About This Presentation
Title:

????? (Inheritance and Polymorphism)

Description:

(Inheritance and Polymorphism) / / – PowerPoint PPT presentation

Number of Views:175
Avg rating:3.0/5.0
Slides: 160
Provided by: Shyh8
Category:

less

Transcript and Presenter's Notes

Title: ????? (Inheritance and Polymorphism)


1
?????(Inheritance and Polymorphism)
  • ???
  • ??????
  • ??????/???????/
  • ???????????

2
??
  1. ??
  2. ???protected
  3. ????
  4. ????????????
  5. OCP??-????
  6. ??
  7. ?????
  8. ????????0.1?

3
??
  • ????System.Object
  • LSP Liskov?????
  • ????
  • DIP ???????
  • ??
  • ISP ??????
  • ????
  • ??????

4
??
  1. ??
  2. ???protected
  3. ????
  4. ????????????
  5. OCP??-????
  6. ??
  7. ?????
  8. ????????0.1?

5
UsingInheritance.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

6
UsingInheritance.Program.Main ??(1/2)
  • switch (op)
  • case
  • result AdvancedCalculator.Add(operand1,operand
    2)
  • Console.WriteLine("0 1 2 ",
  • operand1, operand2, result)
  • break
  • . . .

7
UsingInheritance.Program.Main ??(2/2)
  • case
  • result
  • AdvancedCalculator.Power(operand1, operand2)
  • Console.WriteLine( " 0 1 2",
  • operand1, operand2, result)
  • break
  • . . .

8
UsingInheritance.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
12
DataMemberInheritance.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

13
DataMemberInheritance.B
  • class B A
  • private int data3
  • public B()
  • data3 3
  • public void GetBData(out int data3)
  • data3 this.data3

14
DataMemberInheritance.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

15
DataMemberInheritance.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)

16
DataMemberInheritance.Program.Main ?? (2/2)
  • c.GetBData(out data3)
  • Debug.Assert(data3 3)
  • c.GetCData(out data1, out data4)
  • Debug.Assert(data1 5 data4 4)

17
MemberFunctionInheritance.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

18
MemberFunctionInheritance.B
  • class B A
  • private int data3
  • public B()
  • data3 3
  • public int Data3
  • get return data3
  • public int GetSum()
  • return (GetData2() data3)

19
MemberFunctionInheritance.C (1/2)
  • class C B
  • private int data1
  • private int data4
  • public C()
  • data1 5
  • data4 4
  • public new int GetData1()
  • return data1

20
MemberFunctionInheritance.C (2/2)
  • public int GetData4()
  • return data4
  • public int GetAData1()
  • return base.GetData1()

21
MemberFunctionInheritance.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)

22
MemberFunctionInheritance.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
??
  1. ??
  2. ???protected
  3. ????
  4. ????????????
  5. OCP??-????
  6. ??
  7. ?????
  8. ????????0.1?

25
CalculatorInheritance???
26
CalculatorInheritance.Program.Main??
  • Calculator c new Calculator()
  • c.Run()
  • AdvancedCalculator ac new AdvancedCalculator()
  • ac.Run()

27
CalculatorInheritance.Calculator??
  • protected int register1
  • protected int register2
  • protected int display
  • protected char op
  • public Calculator()
  • register1 0
  • register2 0
  • display 0
  • op ''

28
CalculatorInheritance.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())

29
CalculatorInheritance.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)

30
CalculatorInheritance.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

31
CalculatorInheritance.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())

32
CalculatorInheritance.AdvancedCalculator (2/3)
  • Console.Write("Enter operand 2")
  • register2int.Parse(Console.ReadLine())
  • switch (op)
  • . . . . . .
  • case ''
  • Power()
  • break
  • default
  • . . . . . .
  • Console.WriteLine(display)

33
CalculatorInheritance.AdvancedCalculator (3/3)
  • protected void Power()
  • display (int) Math.Pow(register1,
  • register2)

34
??
  1. ??
  2. ???protected
  3. ????
  4. ????????????
  5. OCP??-????
  6. ??
  7. ?????
  8. ????????0.1?

35
SealedClassExample.Parent
  • sealed class Parent
  • private int data1
  • public Parent()
  • data1 0
  • public int Data1
  • get return data1

36
SealedClassExample.Child
  • class Child Parent // Error!
  • private int data2
  • public Child()
  • data2 0
  • public int Data2
  • get return data2

37
??
  1. ??
  2. ???protected
  3. ????
  4. ????????????
  5. OCP??-????
  6. ??
  7. ?????
  8. ????????0.1?

38
UsingConstructorsForInheritance.Program.Main ??
  • Animal slug new Animal()
  • Animal tweety new Animal( "canary" )
  • Primate godzilla new Primate()
  • Primate human new Primate( 4 )
  • Human jill new Human()

39
UsingConstructorsForInheritance.Animal
  • class Animal
  • private string species
  • public Animal()
  • Console.WriteLine("Animal()")
  • species "Animal"
  • public Animal( string s )
  • Console.WriteLine("Animal(" s ")")
  • species s

40
UsingConstructorsForInheritanc.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

41
UsingConstructorsForInheritanc.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
??
  1. ??
  2. ???protected
  3. ????
  4. ????????????
  5. OCP??-????
  6. ??
  7. ?????
  8. ????????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???
47
OCPViolationExample.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)

48
OCPViolationExample.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

49
OCPViolationExample.Program.DrawCircle?DrawRectang
le
  • static void DrawCircle(Circle c)
  • Console.WriteLine("Draw a circle")
  • static void DrawRectangle(Rectangle r)
  • Console.WriteLine("Draw a rectangle")

50
OCPViolationExample
  • 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

51
OCPViolationExample.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

52
OCPViolationExample?????
  • ??????Shape???(??,???????????)???????switch??
  • ??????Shape???,????enum??????switch??,????Program?
    ????Draw??

53
??
  1. ??
  2. ???protected
  3. ????
  4. ????????????
  5. OCP??-????
  6. ??
  7. ?????
  8. ????????0.1?

54
?????????
  • ??(packaging)
  • ??(inheritance)
  • ??(polymorphism)

55
??
  • ?????(compile-time binding)??????(run-time
    binding)
  • ????(static binding)?????(dynamic binding)
  • ?????
  • ??????
  • ??(virtual)???(override)
  • ???????
  • ??????

56
DrawingAllShapes???
57
DrawingAllShapes.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())

58
DrawingAllShapes.Program.Main??(2/2)
  • switch (ans)
  • case 1
  • list0 c
  • list1 r
  • break
  • case 2
  • list0 r
  • list1 c
  • break
  • default
  • . . .
  • DrawAllShapes(list)

59
DrawingAllShapes.Program.DrawAllShapes
  • static void DrawAllShapes(Shape list)
  • int i
  • for (i 0 i lt list.Length i)
  • listi.Draw()

60
DrawingAllShapes.Shape
  • class Shape
  • public Shape()
  • virtual public void Draw()

61
DrawingAllShapes.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")

62
DrawingAllShapes.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")

63
DrawingAllShapes????
?????
?????
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
??
  1. ??
  2. ???protected
  3. ????
  4. ????????????
  5. OCP??-????
  6. ??
  7. ?????
  8. ????????0.1?

66
NewVsOverride.Program???
67
NewVsOverride.Car
  • // Define the base class
  • class Car
  • public virtual void DescribeCar()
  • System.Console.WriteLine(
  • "Four wheels and an engine.")

68
NewVsOverride.ConvertibleCar
  • // Define the derived classes
  • class ConvertibleCar Car
  • public new virtual void DescribeCar()
  • base.DescribeCar()
  • Console.WriteLine(
  • "A roof that opens up.")

69
NewVsOverride.Minivan
  • class Minivan Car
  • public override void DescribeCar()
  • base.DescribeCar()
  • Console.WriteLine(
  • "Carries seven people.")

70
NewVsOverride.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("----------")

71
UsingBase.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
??
  • ???????????NewVsOverride

74
??
  1. ??
  2. ???protected
  3. ????
  4. ????????????
  5. OCP??-????
  6. ??
  7. ?????
  8. ????????0.1?

75
BlackJack_0_1 ???
76
BlackJack_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()

77
BlackJack_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)

78
BlackJack_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()

79
BlackJack_0_1.Game ?? (2/6)
  • private void Play()
  • int i
  • // ?????
  • for (i 0 i lt N_PLAYERS i)
  • playersi.SaveACard(
  • deck.DealACard())
  • playersi.Dump()

80
BlackJack_0_1.Game ?? (3/6)
  • // ?????
  • for (i0 i lt N_PLAYERS i)
  • playersi.SaveACard(
  • deck.DealACard())
  • playersi.Dump()

81
BlackJack_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

82
BlackJack_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)

83
BlackJack_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)

84
BlackJack_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 "???"

85
BlackJack_0_1.Player ??(2/5)
  • public Player(string name)
  • nCards 0
  • this.name name
  • public string Name
  • get return name

86
BlackJack_0_1.Player ??(3/5)
  • virtual public bool WantOneMoreCard()
  • Console.Write("??????? (y/n) ")
  • string answer Console.ReadLine()
  • return (answer "Y" answer "y")

87
BlackJack_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()

88
BlackJack_0_1.Player ??(5/5)
  • Console.WriteLine()
  • Console.WriteLine(name " ??? "
  • totalPoints)

89
BlackJack_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

92
InheritingObject.Program.Main??
  • Test t1 new Test()
  • Test t2 new Test()
  • bool isEqual t1.Equals(t2)
  • Console.WriteLine(t1.ToString())
  • Console.WriteLine("t1 ?t2 ???" isEqual)

93
InheritingObject.Test
  • class Test
  • override public string ToString()
  • return "??InheritingObject.Test"

94
Boxing ? Unboxing
  • int x 10
  • Object obj (Object) x // boxing
  • obj 20
  • int j (int)obj // unboxing

95
??
  • ????System.Object
  • LSP Liskov?????
  • ????
  • DIP ???????
  • ??
  • ISP ??????
  • ????
  • ??????

96
Liskov ?????(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
97
IS-A ?????
98
LSPViolationExample.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

99
LSPViolationExample.Rectangle (2/2)
  • public int Area()
  • return width height

100
LSPViolationExample.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

101
LSPViolationExample.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
????
105
AbstractClassExample.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())

106
AbstractClassExample.Shape
  • public abstract class Shape
  • private string shape
  • public Shape(string shape)
  • this.shape shape
  • Console.WriteLine("??" shape)
  • abstract public double Area()

107
AbstractClassExample.Square
  • public class Square Shape
  • double a
  • public Square(double a) base("???")
  • this.a a
  • public override double Area()
  • return a a

108
AbstractClassExample.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)
115
DIPViolationExample.LampStatus?ButtonStatus
  • public enum LampStatus
  • OFF 0,
  • ON 1
  • public enum ButtonStatus
  • RELEASED 0,
  • PRESSED 1

116
DIPViolationExample.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

117
DIPViolationExample.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

118
DIPViolationExample.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()

119
DIPViolationExample.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")

120
DIPViolationExample.Program.Main() ?? (2/3)
  • if (rand.Next() 2 1)
  • if (button.Status
  • ButtonStatus.PRESSED)
  • button.Release()
  • else
  • button.Press()

121
DIPViolationExample.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
??
124
UsingInterface.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())

125
UsingInterface.Shape
  • interface Shape
  • double Area()

126
UsingInterface.Square
  • public class Square Shape
  • double a
  • public Square(double a)
  • this.a a
  • public double Area()
  • return a a

127
UsingInterface.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???
131
ButtonAndLamp
  • public interface SwitchableDevice
  • void TurnOn()
  • void TurnOff()
  • public enum LampStatus
  • OFF 0,
  • ON 1
  • public enum ButtonStatus
  • RELEASED 0,
  • PRESSED 1

132
ButtonAndLamp.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

133
ButtonAndLamp.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

134
ButtonAndLamp.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???
139
ISPViolationExample
  • interface TimerClient
  • void TimeOut()
  • interface Door TimerClient
  • void Lock()
  • void Unlock()
  • bool IsOpen()
  • enum DoorStatus
  • CLOSED 0,
  • OPEN 1

140
ISPViolationExample.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

141
ISPViolationExample.Timer (2/2)
  • public void Advance()
  • t
  • if (t timeout 0)
  • client.TimeOut()

142
ISPViolationExample.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

143
ISPViolationExample.TimedDoor (2/2)
  • public void TimeOut()
  • Lock()

144
ISPViolationExample.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)

145
ISPViolationExample.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???
148
MultiInterface.Program.Main??
  • Floatplane fp new Floatplane()
  • fp.Sail()
  • fp.Fly()

149
MultiInterface
  • interface Plane
  • void Fly()
  • interface Ship
  • void Sail()

150
MultiInterface.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???
153
TimedDoorSimulation??
  • 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???
156
CastMultiInterfaces.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() )

157
CastMultiInterfaces
  • interface Rectangle
  • double Area()
  • interface Rhombus
  • double Area()

158
CastMultiInterfaces.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

159
CastMultiInterfaces.Square (2/2)
  • double Rectangle.Area()
  • return a a
  • double Rhombus.Area()
  • return 0.5 d d
Write a Comment
User Comments (0)
About PowerShow.com