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.Program.Main() ??(1/2)
- AdvancedCalculator calculator new
AdvancedCalculator() - . . .
- switch (op)
-
- case 1
- result calculator.Add(operand1,operand2)
- Console.WriteLine("0 1 2 ",
- operand1, operand2, result)
- break
- . . .
7UsingInheritance.Program.Program.Main() ??(2/2)
- case 5
- functionValue calculator.GetSine(angle)
- Console.WriteLine(
- "Sine of 0 (deg) 1",
- angle, functionValue)
- break
- . . .
8UsingInheritance.AdvancedCalculator ??
- public class AdvancedCalculator Calculator
-
- public double GetSine(double angle)
-
- angle Math.PI / 180.0
- return Math.Sin(angle)
-
- . . .
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??
13??
- ??
- ???protected
- ????
- ????????????
- OCP??-????
- ??
- ????????0.1?
- ?????
14UsingProtected.Program.Program.Main()??
- DC d new DC()
- d.SetX(3)
- //Console.WriteLine( d.GetX() ) // Error!
- //d.x 77 // Error!
- d.Add2()
15UsingProtected.Program??
- class BC
-
- private int x
- public void SetX( int x ) this.x x
- protected int GetX() return x
-
- class DC BC
-
- public void Add2()
-
- int c GetX()
- SetX( c2 )
-
16??
- ??
- ???protected
- ????
- ????????????
- OCP??-????
- ??
- ????????0.1?
- ?????
17????
- sealed class SClass
-
- . . . . . .
18??
- ??
- ???protected
- ????
- ????????????
- OCP??-????
- ??
- ????????0.1?
- ?????
19UsingConstructorsForInheritance.Program.Main() ??
- Animal slug new Animal()
- Animal tweety new Animal( "canary" )
- Primate godzilla new Primate()
- Primate human new Primate( 4 )
- Human jill new Human()
20UsingConstructorsForInheritance.Program ??(1/3)
- class Animal
-
- private string species
- public Animal()
-
- Console.WriteLine("Animal()")
- species "Animal"
-
- public Animal( string s )
-
- Console.WriteLine("Animal(" s ")")
- species s
-
21UsingConstructorsForInheritance.Program??(2/3)
- class Primate Animal
-
- private int heartCham
- public Primate() base()
-
- Console.WriteLine( "Primate()" )
-
- public Primate( int n ) base( "Primate" )
-
- Console.WriteLine("Primate(" n ")")
- heartCham n
-
22UsingConstructorsForInheritance.Program ??(3/3)
- class Human Primate
-
- public Human() base( 4 )
-
- Console.WriteLine( "Human()" )
-
-
23????????
Primate human new Primate( 4 )
public Primate( int n ) base( "Primate" )
. . .
public Animal( string s ) . . .
24??
- ???????????UsingConstructorsForInheritance
25??
- ??
- ???protected
- ????
- ????????????
- OCP??-????
- ??
- ????????0.1?
- ?????
26??-????(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
27??OCPViolationExample???
28OCPViolationExample.Program.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)
29OCPViolationExample.Program.Program ?? (1/2)
- 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
-
-
30OCPViolationExample.Program.Program ?? (2/2)
- static void DrawCircle(Circle c)
-
- Console.WriteLine("Draw a circle")
-
- static void DrawRectangle(Rectangle r)
-
- Console.WriteLine("Draw a rectangle")
31OCPViolationExample.Program ?? (1/2)
- 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
-
32OCPViolationExample.Program ?? (2/2)
- 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
-
33OCPViolationExample?????
- ??????Shape???(??,???????????)???????switch??
- ??????Shape???,????enum??????switch??,????Program?
????Draw??
34??
- ??
- ???protected
- ????
- ????????????
- OCP??-????
- ??
- ????????0.1?
- ?????
35?????????
- ??(packaging)
- ??(inheritance)
- ??(polymorphism)
36??
- ?????(compile-time binding)??????(run-time
binding) - ????(static binding)?????(dynamic binding)
- ?????
- ??????
- ??(virtual)???(override)
- ???????
- ??????
37DrawingAllShapes???
38DrawingAllShapes.Program.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())
39DrawingAllShapes.Program.Program.Main() ??(2/2)
- switch (ans)
-
- case 1
- list0 c
- list1 r
- break
- case 2
- list0 r
- list1 c
- break
- default
- . . .
-
- DrawAllShapes(list)
40DrawingAllShapes.Program.Program ??
- static void DrawAllShapes(Shape list)
-
- int i
- for (i 0 i lt list.Length i)
-
- listi.Draw()
-
41DrawingAllShapes.Program ??(1/3)
- class Shape
-
- public Shape()
- virtual public void Draw()
42DrawingAllShapes.Program ??(2/3)
- 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")
-
-
43DrawingAllShapes.Program ??(3/3)
- 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")
-
44??
- ???DrawingAllShapes????Triangle,???????????
45??
- ??
- ???protected
- ????
- ????????????
- OCP??-????
- ??
- ????????0.1?
- ?????
46BlackJack_0_1 ???
47BlackJack_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()
-
48BlackJack_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)
49BlackJack_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()
50BlackJack_0_1.Game ?? (2/6)
- private void Play()
-
- int i
- // ?????
- for (i 0 i lt N_PLAYERS i)
-
- playersi.SaveACard(
- deck.DealACard())
- playersi.Dump()
-
51BlackJack_0_1.Game ?? (3/6)
- // ?????
- for (i0 i lt N_PLAYERS i)
-
- playersi.SaveACard(
- deck.DealACard())
- playersi.Dump()
-
52BlackJack_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
-
-
53BlackJack_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)
-
-
-
54BlackJack_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)
55BlackJack_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 "???"
-
-
56BlackJack_0_1.Player ??(2/5)
- public Player(string name)
-
- nCards 0
- this.name name
-
- public string Name
-
- get return name
-
-
57BlackJack_0_1.Player ??(3/5)
- virtual public bool WantOneMoreCard()
-
- Console.Write("??????? (y/n) ")
- string answer Console.ReadLine()
- return (answer "Y" answer "y")
58BlackJack_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()
-
59BlackJack_0_1.Player ??(5/5)
- Console.WriteLine()
- Console.WriteLine(name " ??? "
- totalPoints)
60BlackJack_0_1.Dealer??
- class Dealer Player
- public Dealer() base("??")
- override public bool WantOneMoreCard()
-
- return (base.GetTotalPoints() lt 17)
-
61??
- ??
- ???protected
- ????
- ????????????
- OCP??-????
- ??
- ????????0.1?
- ?????
62UsingBase.Program???
63UsingBase.Program?? (1/3)
- // Define the base class
- class Car
-
- public virtual void DescribeCar()
-
- System.Console.WriteLine(
- "Four wheels and an engine.")
-
-
-
64UsingBase.Program?? (2/3)
- // Define the derived classes
- class ConvertibleCar Car
-
- public new virtual void DescribeCar()
-
- base.DescribeCar()
- Console.WriteLine(
- "A roof that opens up.")
-
65UsingBase.Program?? (3/3)
- class Minivan Car
-
- public override void DescribeCar()
-
- base.DescribeCar()
- Console.WriteLine(
- "Carries seven people.")
-
66UsingBase.Program.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("----------")
67UsingBase.Program.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("----------")
68?????
- ?? override
- ????Polymorphism (??)
- ?????
- ?? new
- ??????????????????
- ???????
69??
70??
- ????System.Object
- LSP Liskov?????
- ????
- DIP ???????
- ??
- ISP ??????
- ????
- ??????
71????System.Object
- ?????
- ????
- Equals
- GetHashCode
- GetType
- ReferenceEquals
- ToString
- Finalize
72InheritingObject.Program.Program.Main()??
- Test t1 new Test()
- Test t2 new Test()
- bool isEqual t1.Equals(t2)
- Console.WriteLine(t1.ToString())
- Console.WriteLine("t1 ?t2 ???" isEqual)
73InheritingObject.Program ??
- class Test
-
- override public string ToString()
-
- return "??InheritingObject.Test"
-
74Boxing ? Unboxing
- int x 10
- Object obj (Object) x // boxing
- obj 20
- int j (int)obj // unboxing
75??
- ????System.Object
- LSP Liskov?????
- ????
- DIP ???????
- ??
- ISP ??????
- ????
- ??????
76Liskov ?????(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
77IS-A ?????
78LSPViolationExample.Program?? (1/4)
- class Rectangle
-
- private int width
- private int height
- virtual public int Width
-
- set width value
-
- virtual public int Height
-
- set height value
-
79LSPViolationExample.Program?? (2/4)
- public int Area()
-
- return width height
-
80LSPViolationExample.Program?? (3/4)
- 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
-
81LSPViolationExample.Program?? (4/4)
- 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)
-
82??????????
- ???????????
- Rectangle.Width?????
- Debug.Assert( (width value)
- (height old.height))
- ??LSP???????????
- ????????????????????,????
- ????????????????????,????
83??
- ????System.Object
- LSP Liskov?????
- ????
- DIP ???????
- ??
- ISP ??????
- ????
- ??????
84????
85AbstractClassExample.Program.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())
-
86AbstractClassExample.Program?? (1/3)
- public abstract class Shape
- private string shape
- public Shape(string shape)
- this.shape shape
- Console.WriteLine("??" shape)
-
- abstract public double Area()
87AbstractClassExample.Program?? (2/3)
- public class Square Shape
-
- double a
- public Square(double a) base("???")
-
- this.a a
-
- public override double Area()
-
- return a a
-
88AbstractClassExample.Program?? (3/3)
- public class Circle Shape
-
- double r
- public Circle(double r) base("??")
-
- this.r r
-
- public override double Area()
-
- return Math.PI r r
-
89??
- ???DrawingAllShapes????Shape??????,??Shape.Draw()?
?????
90????
91??
- ????System.Object
- LSP Liskov?????
- ????
- DIP ???????
- ??
- ISP ??????
- ????
- ??????
92???????(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
93????DIP???
94???(State Chart)
95DIPViolationExample.Program?? (1/4)
- public enum LampStatus
-
- OFF 0,
- ON 1
-
- public enum ButtonStatus
-
- RELEASED 0,
- PRESSED 1
96DIPViolationExample.Program?? (2/4)
- 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
-
97DIPViolationExample.Program?? (3/4)
- public class Button
-
- private ButtonStatus status
- ButtonStatus.RELEASED
- private Lamp lamp
- public Button(Lamp lamp)
-
- this.lamp lamp
-
- public ButtonStatus Status
- get return status
-
-
98DIPViolationExample.Program?? (4/4)
- public void Press()
- if (status ButtonStatus.RELEASED)
- status ButtonStatus.PRESSED
- lamp.TurnOn()
-
-
- public void Release()
- if( status ButtonStatus.PRESSED )
- status ButtonStatus.RELEASED
- lamp.TurnOff()
-
-
99DIPViolationExample.Program.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")
-
100DIPViolationExample.Program.Program.Main() ??
(2/3)
- if (rand.Next() 2 1)
-
- if (button.Status
- ButtonStatus.PRESSED)
-
- button.Release()
-
- else
-
- button.Press()
-
-
101DIPViolationExample.Program.Program.Main() ??
(3/3)
- if (lamp1.Status LampStatus.OFF)
-
- Console.WriteLine("lamp1 is off")
-
- else
-
- Console.WriteLine("lamp1 is on")
-
- Console.WriteLine()
102??
- ????System.Object
- LSP Liskov?????
- ????
- DIP ???????
- ??
- ISP ??????
- ????
- ??????
103??
104UsingInterface.Program.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())
105UsingInterface.Program??(1/3)
- interface Shape
-
- double Area()
-
-
106UsingInterface.Program??(2/3)
- public class Square Shape
-
- double a
- public Square(double a)
-
- this.a a
-
- public double Area()
-
- return a a
-
-
107UsingInterface.Program??(3/3)
- public class Circle Shape
-
- double r
- public Circle(double r)
-
- this.r r
-
- public double Area()
-
- return Math.PI r r
-
108?? 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()
109?? vs. ???? (2/2)
- public class Square Shape
- . . .
- public double Area()
- return a a
-
-
- --------------------------------------------
- public class Square Shape
- . . .
- public override double Area()
- return a a
-
110????DIP???
111ButtonAndLamp.Program (1/4)
- public interface SwitchableDevice
- void TurnOn()
- void TurnOff()
-
- public enum LampStatus
- OFF 0,
- ON 1
-
- public enum ButtonStatus
- RELEASED 0,
- PRESSED 1
112ButtonAndLamp.Program (2/4)
- 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
-
113ButtonAndLamp.Program (3/4)
- public class Button
-
- private ButtonStatus status
- ButtonStatus.RELEASED
- private SwitchableDevice device
- public Button(SwitchableDevice device)
-
- this.device device
-
- public ButtonStatus Status
- get return status
-
114ButtonAndLamp.Program (4/4)
- public void Press()
- if (status ButtonStatus.RELEASED)
- status ButtonStatus.PRESSED
- device.TurnOn()
-
-
- public void Release()
- if (status ButtonStatus.PRESSED)
- status ButtonStatus.RELEASED
- device.TurnOff()
-
-
115??
- ???ButtonAndLamp????Fan,?Button?????Fan????
116??
- ????System.Object
- LSP Liskov?????
- ????
- DIP ???????
- ??
- ISP ??????
- ????
- ??????
117??????(ISP Interface-Segregation Principle)
- Clients should not be forced to depend on methods
that they do not use - ???????????????????
118????ISP???
119ISPViolationExample.Program?? (1/4)
- interface TimerClient
- void TimeOut()
-
- interface Door TimerClient
- void Lock()
- void Unlock()
- bool IsOpen()
-
- enum DoorStatus
- CLOSED 0,
- OPEN 1
120ISPViolationExample.Program?? (2/4)
- 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
-
121ISPViolationExample.Program?? (3/4)
- public void Advance()
- t
- if (t timeout 0)
- client.TimeOut()
-
-
-
- class TimedDoor Door
-
- private DoorStatus status
- DoorStatus.CLOSED
122ISPViolationExample.Program?? (4/4)
- public bool IsOpen()
- return (status DoorStatus.OPEN)
-
- public void Lock()
- if (IsOpen()) status DoorStatus.CLOSED
-
- public void Unlock()
- if (!IsOpen()) status DoorStatus.OPEN
-
- public void TimeOut()
- Lock()
-
-
123ISPViolationExample.Program.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)
-
124ISPViolationExample.Program.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()
125??
- ????System.Object
- LSP Liskov?????
- ????
- DIP ???????
- ??
- ISP ??????
- ????
- ??????
126??MultiInterface???
127MultiInterface.Program.Program.Main()??
- Floatplane fp new Floatplane()
- fp.Sail()
- fp.Fly()
128MultiInterface.Program?? (1/2)
- interface Plane
-
- void Fly()
-
- interface Ship
-
- void Sail()
-
-
129MultiInterface.Program?? (2/2)
- public class Floatplane Plane, Ship
- public Floatplane()
- Console.WriteLine("??????")
-
- public void Sail()
- Console.WriteLine("????")
-
- public void Fly()
- Console.WriteLine("????")
-
130??
- ??????, ?????????Clock_Radio,????Clock?GetTime()??
?Radio?PlayMusic()??
131????ISP???
132TimedDoorSimulation.Program??
- interface TimerClient
- void TimeOut()
-
- interface Door
- void Lock()
- void Unlock()
- bool IsOpen()
-
- . . .
- class TimedDoor Door, TimerClient
-
- . . .
133??
- ????System.Object
- LSP Liskov?????
- ????
- DIP ???????
- ??
- ISP ??????
- ????
- ??????
134??CastMultiInterfaces???
135CastMultiInterfaces.Program.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() )
-
136CastMultiInterfaces.Program??(1/3)
- interface Rectangle
-
- double Area()
-
- interface Rhombus
-
- double Area()
-
-
137CastMultiInterfaces.Program??(2/3)
- public class Square Rectangle, Rhombus
-
- private double a
- private double d
- public Square(double a)
-
- this.a a
- d Math.Sqrt(2.0) a
-
-
-
138CastMultiInterfaces.Program??(3/3)
- double Rectangle.Area()
-
- return a a
-
- double Rhombus.Area()
-
- return 0.5 d d
-
-