ΠΠ»Π°ΡΡΡ-ΠΌΠ°Π½Π΄Π°ΡΡ
ΠΡΠΎΠΌΠ΅ΠΆΡΡΠΎΡΠ½ΡΠΌ ΡΠ΅ΡΠ΅Π½ΠΈΠ΅ΠΌ ΠΌΠ΅ΠΆΠ΄Ρ ΠΎΠ΄ΠΈΠ½ΠΎΡΠ½ΡΠΌ ΠΈ ΠΌΠ½ΠΎΠΆΠ΅ΡΡΠ²Π΅Π½Π½ΡΠΌ Π½Π°ΡΠ»Π΅Π΄ΠΎΠ²Π°Π½ΠΈΠ΅ΠΌ ΠΊΠ»Π°ΡΡΠΎΠ² ΠΌΠΎΠΆΠ΅Ρ Π±ΡΡΡ ΠΈΡΠΏΠΎΠ»ΡΠ·ΠΎΠ²Π°Π½ΠΈΠ΅ ΠΊΠ»Π°ΡΡΠΎΠ²-ΠΌΠ°Π½Π΄Π°ΡΠΎΠ². Π’Π°ΠΊ, ΠΊΠ»Π°ΡΡ Horse ΠΌΠΎΠΆΠ½ΠΎ ΠΏΡΠΎΠΈΠ·Π²Π΅ΡΡΠΈ ΠΎΡ Π΄Π²ΡΡ Π±Π°Π·ΠΎΠ²ΡΡ ΠΊΠ»Π°ΡΡΠΎΠ² β Animal ΠΈ Displayable, ΠΏΡΠΈΡΠ΅ΠΌ ΠΏΠΎΡΠ»Π΅Π΄Π½ΠΈΠΉ Π΄ΠΎΠ±Π°Π²Π»ΡΠ΅Ρ ΡΠΎΠ»ΡΠΊΠΎ Π½Π΅ΠΊΠΎΡΠΎΡΡΠ΅ ΠΌΠ΅ΡΠΎΠ΄Ρ ΠΎΡΠΎΠ±ΡΠ°ΠΆΠ΅Π½ΠΈΡ ΠΎΠ±ΡΠ΅ΠΊΡΠΎΠ² Π½Π° ΡΠΊΡΠ°Π½Π΅.
ΠΠ»Π°ΡΡΠΎΠΌ-ΠΌΠ°Π½Π΄Π°ΡΠΎΠΌ Π½Π°Π·ΡΠ²Π°Π΅ΡΡΡ ΠΊΠ»Π°ΡΡ, ΠΎΡΠΊΡΡΠ²Π°ΡΡΠΈΠΉ Π΄ΠΎΡΡΡΠΏ ΠΊ ΡΡΠ΄Ρ ΠΌΠ΅ΡΠΎΠ΄ΠΎΠ², Π½ΠΎ Π½Π΅ ΡΠΎΠ΄Π΅ΡΠΆΠ°ΡΠΈΠΉ Π½ΠΈΠΊΠ°ΠΊΠΈΡ Π΄Π°Π½Π½ΡΡ (ΠΈΠ»ΠΈ, ΠΏΠΎ ΠΊΡΠ°ΠΉΠ½Π΅ΠΉ ΠΌΠ΅ΡΠ΅, ΡΠΎΠ΄Π΅ΡΠΆΠ°ΡΠΈΠΉ ΠΌΠΈΠ½ΠΈΠΌΠ°Π»ΡΠ½ΡΠΉ Π½Π°Π±ΠΎΡ Π΄Π°Π½Π½ΡΡ ).
ΠΠ΅ΡΠΎΠ΄Ρ ΠΊΠ»Π°ΡΡΠ°-ΠΌΠ°Π½Π΄Π°ΡΠ° ΠΏΠ΅ΡΠ΅Π΄Π°ΡΡΡΡ Π² ΠΏΡΠΎΠΈΠ·Π²ΠΎΠ΄Π½ΡΠ΅ ΠΊΠ»Π°ΡΡΡ Ρ ΠΏΠΎΠΌΠΎΡΡΡ ΠΎΠ±ΡΡΠ½ΠΎΠ³ΠΎ Π½Π°ΡΠ»Π΅Π΄ΠΎΠ²Π°Π½ΠΈΡ. ΠΠ΄ΠΈΠ½ΡΡΠ²Π΅Π½Π½ΠΎΠ΅ ΠΎΡΠ»ΠΈΡΠΈΠ΅ ΠΊΠ»Π°ΡΡΠΎΠ²-ΠΌΠ°Π½Π΄Π°ΡΠΎΠ² ΠΎΡ Π΄ΡΡΠ³ΠΈΡ ΠΊΠ»Π°ΡΡΠΎΠ² ΡΠΎΡΡΠΎΠΈΡ Π² ΡΠΎΠΌ, ΡΡΠΎ ΠΎΠ½ΠΈ ΠΏΡΠ°ΠΊΡΠΈΡΠ΅ΡΠΊΠΈ Π½Π΅ ΡΠΎΠ΄Π΅ΡΠΆΠ°Ρ Π½ΠΈΠΊΠ°ΠΊΠΈΡ Π΄Π°Π½Π½ΡΡ . Π Π°Π·Π»ΠΈΡΠΈΠ΅ Π΄ΠΎΠ²ΠΎΠ»ΡΠ½ΠΎ ΡΡΠ±ΡΠ΅ΠΊΡΠΈΠ²Π½ΠΎΠ΅ ΠΈ ΠΎΡΡΠ°ΠΆΠ°Π΅Ρ ΡΠΎΠ»ΡΠΊΠΎ ΠΎΠ±ΡΡΡ ΡΠ΅Π½Π΄Π΅Π½ΡΠΈΡ ΠΏΡΠΎΠ³ΡΠ°ΠΌΠΌΠΈΡΠΎΠ²Π°Π½ΠΈΡ, ΡΠ²ΠΎΠ΄ΡΡΡΡΡΡ ΠΊ ΡΠΎΠΌΡ, ΡΡΠΎ Π΄ΠΎΠ±Π°Π²Π»Π΅Π½ΠΈΠ΅ ΡΡΠ½ΠΊΡΠΈΠΎΠ½Π°Π»ΡΠ½ΠΎΡΡΠΈ ΠΊΠ»Π°ΡΡΠ°ΠΌ Π½Π΅ Π΄ΠΎΠ»ΠΆΠ½ΠΎ ΡΠΎΠΏΡΠΎΠ²ΠΎΠΆΠ΄Π°ΡΡΡΡ ΡΡΠ»ΠΎΠΆΠ½Π΅Π½ΠΈΠ΅ΠΌ ΠΏΡΠΎΠ³ΡΠ°ΠΌΠΌΡ. ΠΡΠΏΠΎΠ»ΡΠ·ΠΎΠ²Π°Π½ΠΈΠ΅ ΠΊΠ»Π°ΡΡΠΎΠ²-ΠΌΠ°Π½Π΄Π°ΡΠΎΠ² ΡΠ°ΠΊΠΆΠ΅ ΡΠ½ΠΈΠΆΠ°Π΅Ρ Π²Π΅ΡΠΎΡΡΠ½ΠΎΡΡΡ Π²ΠΎΠ·Π½ΠΈΠΊΠ½ΠΎΠ²Π΅Π½ΠΈΡ Π½Π΅ΠΎΠΏΡΠ΅Π΄Π΅Π»Π΅Π½Π½ΠΎΡΡΠ΅ΠΉ ΠΏΡΠΈ ΠΈΡΠΏΠΎΠ»ΡΠ·ΠΎΠ²Π°Π½ΠΈΠΈ Π² ΠΏΡΠΎΠΈΠ·Π²ΠΎΠ΄Π½ΠΎΠΌ ΠΊΠ»Π°ΡΡΠ΅ Π΄Π°Π½Π½ΡΡ , ΡΠ½Π°ΡΠ»Π΅Π΄ΠΎΠ²Π°Π½Π½ΡΡ ΠΈΠ· Π΄ΡΡΠ³ΠΈΡ Π±Π°Π·ΠΎΠ²ΡΡ ΠΊΠ»Π°ΡΡΠΎΠ².
ΠΠ°ΠΏΡΠΈΠΌΠ΅Ρ, ΠΏΡΠ΅Π΄ΠΏΠΎΠ»ΠΎΠΆΠΈΠΌ, ΡΡΠΎ ΠΊΠ»Π°ΡΡ Horse ΠΏΡΠΎΠΈΠ·Π²ΠΎΠ΄ΠΈΡΡΡ ΠΎΡ Π΄Π²ΡΡ ΠΊΠ»Π°ΡΡΠΎΠ² β Animal ΠΈ Displayable, ΠΏΡΠΈΡΠ΅ΠΌ ΠΏΠΎΡΠ»Π΅Π΄Π½ΠΈΠΉ Π΄ΠΎΠ±Π°Π²Π»ΡΠ΅Ρ ΡΠΎΠ»ΡΠΊΠΎ Π½ΠΎΠ²ΡΠ΅ ΠΌΠ΅ΡΠΎΠ΄Ρ, Π½ΠΎ Π½Π΅ ΡΠΎΠ΄Π΅ΡΠΆΠΈΡ Π΄Π°Π½Π½ΡΡ . Π ΡΠ°ΠΊΠΎΠΌ ΡΠ»ΡΡΠ°Π΅ Π²ΡΠ΅ Π½Π°ΡΠ»Π΅Π΄ΡΠ΅ΠΌΡΠ΅ Π΄Π°Π½Π½ΡΠ΅ ΠΊΠ»Π°ΡΡΠ° Horse ΠΏΡΠΎΠΈΡΡ ΠΎΠ΄ΡΡ ΡΠΎΠ»ΡΠΊΠΎ ΠΎΡ ΠΎΠ΄Π½ΠΎΠ³ΠΎ Π±Π°Π·ΠΎΠ²ΠΎΠ³ΠΎ ΠΊΠ»Π°ΡΡΠ° Animal, Π° ΠΌΠ΅ΡΠΎΠ΄Ρ Π½Π°ΡΠ»Π΅Π΄ΡΡΡΡΡ ΠΎΡ ΠΎΠ±ΠΎΠΈΡ ΠΊΠ»Π°ΡΡΠΎΠ².
ΠΠ»Π°ΡΡΡ-ΠΌΠ°Π½Π΄Π°ΡΡ (capability class) ΠΈΠ½ΠΎΠ³Π΄Π° Π΅ΡΠ΅ Π½Π°Π·ΡΠ²Π°ΡΡ ΠΌΠΈΠΊΡΠΈΠ½Π°ΠΌΠΈ (mixin). ΠΡΠΎΡ ΡΠ΅ΡΠΌΠΈΠ½ ΠΏΡΠΎΠΈΠ·ΠΎΡΠ΅Π» ΠΎΡ Π½Π°Π·Π²Π°Π½ΠΈΡ Π΄Π΅ΡΠ΅ΡΡΠ°, ΠΏΡΠ΅Π΄ΡΡΠ°Π²Π»ΡΡΡΠ΅Π³ΠΎ ΡΠΎΠ±ΠΎΠΉ ΡΠΌΠ΅ΡΡ ΠΏΠΈΡΠΎΠΆΠ½ΠΎΠ³ΠΎ Ρ ΠΌΠΎΡΠΎΠΆΠ΅Π½ΡΠΌ, ΠΏΠΎΠ»ΠΈΡΡΡ ΡΠ²Π΅ΡΡ Ρ ΡΠΎΠΊΠΎΠ»Π°Π΄Π½ΠΎΠΉ Π³Π»Π°Π·ΡΡΡΡ. ΠΡΠΎΡ Π΄Π΅ΡΠ΅ΡΡ ΠΏΡΠΎΠ΄Π°Π²Π°Π»ΡΡ Π² ΡΡΠΏΠ΅ΡΠΌΠ°ΡΠΊΠ΅ΡΠ°Ρ Sommerville Π² ΡΡΠ°ΡΠ΅ ΠΠ°ΡΡΠ°ΡΡΡΠ΅ΡΡ. ΠΠΈΠ΄ΠΈΠΌΠΎ, ΡΡΠΎ Π±Π»ΡΠ΄ΠΎ ΠΊΠΎΠ³Π΄Π°-ΡΠΎ ΠΏΠΎΠΏΡΠΎΠ±ΠΎΠ²Π°Π» ΠΎΠ΄ΠΈΠ½ ΠΈΠ· ΠΏΡΠΎΠ³ΡΠ°ΠΌΠΌΠΈΡΡΠΎΠ², Π·Π°Π½ΠΈΠΌΠ°ΡΡΠΈΠΉΡΡ ΡΠ°Π·ΡΠ°Π±ΠΎΡΠΊΠΎΠΉ ΡΡΠ΅Π΄ΡΡΠ² ΠΎΠ±ΡΠ΅ΠΊΡΠ½ΠΎ-ΠΎΡΠΈΠ΅Π½ΡΠΈΡΠΎΠ²Π°Π½Π½ΠΎΠ³ΠΎ ΠΏΡΠΎΠ³ΡΠ°ΠΌΠΌΠΈΡΠΎΠ²Π°Π½ΠΈΡ Π΄Π»Ρ ΡΠ·ΡΠΊΠ° SCOOPS, Π³Π΄Π΅ ΡΡΠΎΡ ΡΠ΅ΡΠΌΠΈΠ½ Π²ΠΏΠ΅ΡΠ²ΡΠ΅ ΠΏΠΎΡΠ²ΠΈΠ»ΡΡ.
ΠΠ±ΡΡΡΠ°ΠΊΡΠ½ΡΠ΅ ΡΠΈΠΏΡ Π΄Π°Π½Π½ΡΡ
Π ΠΎΠ±ΡΠ΅ΠΊΡΠ½ΠΎΠΌ ΠΏΡΠΎΠ³ΡΠ°ΠΌΠΌΠΈΡΠΎΠ²Π°Π½ΠΈΠΈ Π΄ΠΎΠ²ΠΎΠ»ΡΠ½ΠΎ ΡΠ°ΡΡΠΎ ΡΠΎΠ·Π΄Π°ΡΡΡΡ ΠΈΠ΅ΡΠ°ΡΡ ΠΈΠΈ Π»ΠΎΠ³ΠΈΡΠ΅ΡΠΊΠΈ ΡΠ²ΡΠ·Π°Π½Π½ΡΡ ΠΊΠ»Π°ΡΡΠΎΠ². ΠΠ°ΠΏΡΠΈΠΌΠ΅Ρ, ΠΏΡΠ΅Π΄ΡΡΠ°Π²ΠΈΠΌ ΠΊΠ»Π°ΡΡ Shape, ΠΎΡ ΠΊΠΎΡΠΎΡΠΎΠ³ΠΎ ΠΏΡΠΎΠΈΠ·Π²Π΅Π΄Π΅Π½Ρ ΠΊΠ»Π°ΡΡΡ Rectangle ΠΈ Circle. ΠΠ°ΡΠ΅ΠΌ ΠΎΡ ΠΊΠ»Π°ΡΡΠ° Rectangle ΠΏΡΠΎΠΈΠ·Π²ΠΎΠ΄ΠΈΡΡΡ ΠΊΠ»Π°ΡΡ Sguare, ΠΊΠ°ΠΊ ΡΠ°ΡΡΠ½ΡΠΉ Π²ΠΈΠ΄ ΠΏΡΡΠΌΠΎΡΠ³ΠΎΠ»ΡΠ½ΠΈΠΊΠ°.
Π ΠΊΠ°ΠΆΠ΄ΠΎΠΌ ΠΈΠ· ΠΏΡΠΎΠΈΠ·Π²ΠΎΠ΄Π½ΡΡ ΠΊΠ»Π°ΡΡΠΎΠ² Π·Π°ΠΌΠ΅ΡΠ°ΡΡΡΡ ΠΌΠ΅ΡΠΎΠ΄Ρ Draw(), GetArea() ΠΈ Π΄Ρ. ΠΡΠ½ΠΎΠ²Π½ΠΎΠΉ ΠΊΠΎΡΡΡΠΊ ΠΏΡΠΎΠ³ΡΠ°ΠΌΠΌΡ Ρ ΠΊΠ»Π°ΡΡΠΎΠΌ Shape ΠΈ ΠΏΡΠΎΠΈΠ·Π²ΠΎΠ΄Π½ΡΠΌΠΈ ΠΎΡ Π½Π΅Π³ΠΎ Rectangle ΠΈ Circle ΠΏΠΎΠΊΠ°Π·Π°Π½ Π² Π»ΠΈΡΡΠΈΠ½Π³Π΅ 13.7.
ΠΠΈΡΡΠΈΠ½Π³ 13.7. ΠΠ»Π°ΡΡΡ ΡΠ΅ΠΌΠ΅ΠΉΡΡΠ²Π° Shape
1: // ΠΠΈΡΡΠΈΠ½Π³ 13.7. ΠΠ»Π°ΡΡΡ ΡΠ΅ΠΌΠ΅ΠΉΡΡΠ²Π° Shape
2:
3: #include <iostream.h>
4:
5:
6: class Shape
7: {
8: public:
9: Shape(){ }
10: virtual ~Shape() { }
11: virtual long GetArea() { return -1; }
12: virtual long GetPerim() { return -1; }
13: virtual void Draw() { }
14: private:
15: };
16:
17: class Circle : public Shape
18: {
19: public:
20: Circle(int radius):itsRadius(radius) { }
21: ~Circle() { }
22: long GetArea() { return 3 * itsRadius * itsRadius; }
23: long GetPerim() { return 6 * itsRadius; }
24: void Draw();
25: private:
26: int itsRadius;
27: int itsCircumference;
28: };
29:
30: void Circle::Draw()
31: {
32: cout << "Circle drawing routine here!\n";
33: }
34:
35:
36: class Rectangle : public Shape
37: {
38: public:
39: Rectangle(int len, int width);
40: itsLength(len), itsWidth(width) { }
41: virtual ~Rectangle() { }
42: virtual long GetArea() { return itsLength * itsWidth; }
43: virtual long GetPerim() { return 2*itsLength + 2*itsWidth; }
44: virtual int GetLength() { return itsLength; }
45: virtual int GetWidth() { return itsWidth; }
46: virtual void Draw();
47: private:
48: int itsWidth;
49: int itsLength;
50: };
51:
52: void Rectangle::Draw()
53: {
54: for (int i = 0; i<itsLength; i++)
55: {
56: for (int j = 0; j<itsWidth; j++)
57: cout << "x ";
58:
59: cout << "\n";
60: }
61: }
62:
63: class Square : public Rectangle
64: {
65: public:
66: Square(int len);
67: Square(int len, int width);
68: ~Square() { }
69: long GetPerim() { return 4 * GetLength();}
70: };
71:
72: Square::Square(int len):
73: Rectangle(len,len)
74: { }
75:
76: Square::Square(int len, int width):
77: Rectangle(len,width) 78:
79: {
80: if (GetLength() != GetWidth())
81: cout << "Error, not a sguare... a Rectangle??\n";
82: }
83:
84: int main()
85: {
86: int choice;
87: bool fQuit = false;
88: Shape * sp;
89:
90: while ( ! fQuit )
91: {
92: cout << "(1)Circle (2)Rectangle (3)Square (0)Quit:";
93: cin >> choice;
94:
95: switch (choice)
96: {
97: case 0: fQuit = true;
98: break;
99: case 1: sp = new Circle(5);
100: break;
101: case 2: sp = new Rectangle(4,6);
102: break;
103: case 3: sp = new Square(5);
104: break;
105: default: cout << "Please enter a number between 0 and 3" << endl;
106: continue;
107: break;
108: }
109: if(! fQuit)
110: sp->Draw();
111: delete sp;
112: cout << "\n";
113: }
114: return 0;
115: }
Π Π΅Π·ΡΠ»ΡΡΠ°Ρ:
(1)Circle (2)Rectangle (3)Square (0)Quit: 2
x x x x x x
X X X X X X
X X X X X X
X X X X X X
(1)Circle (2)Rectangle (3)Square (0)Quit:3
X X X X X
X X X X x
X X X X X
X X X X X
X X X X X
(1)Circle (2)Rectangle (3)Square (0)Quit:0
ΠΠ½Π°Π»ΠΈΠ·: Π ΡΡΡΠΎΠΊΠ°Ρ 6β15 ΠΎΠ±ΡΡΠ²Π»ΡΠ΅ΡΡΡ ΠΊΠ»Π°ΡΡ Shape. ΠΠ΅ΡΠΎΠ΄Ρ GetArea() ΠΈ GetPerim() Π²ΠΎΠ·Π²ΡΠ°ΡΠ°ΡΡ -1 ΠΊΠ°ΠΊ ΡΠΎΠΎΠ±ΡΠ΅Π½ΠΈΠ΅ ΠΎΠ± ΠΎΡΠΈΠ±ΠΊΠ΅, Π° ΠΌΠ΅ΡΠΎΠ΄ Draw() Π½Π΅ Π²ΡΠΏΠΎΠ»Π½ΡΠ΅Ρ Π½ΠΈΠΊΠ°ΠΊΠΈΡ Π΄Π΅ΠΉΡΡΠ²ΠΈΠΉ. ΠΠ°Π²Π°ΠΉΡΠ΅ ΠΏΠΎΠ΄ΡΠΌΠ°Π΅ΠΌ, ΠΌΠΎΠΆΠ½ΠΎ Π»ΠΈ Π² ΠΏΡΠΈΠ½ΡΠΈΠΏΠ΅ Π½Π°ΡΠΈΡΠΎΠ²Π°ΡΡ ΡΠΎΡΠΌΡ? ΠΠΎΠΆΠ½ΠΎ Π½Π°ΡΠΈΡΠΎΠ²Π°ΡΡ ΠΎΠΊΡΡΠΆΠ½ΠΎΡΡΡ, ΠΏΡΡΠΌΠΎΡΠ³ΠΎΠ»ΡΠ½ΠΈΠΊ ΠΈΠ»ΠΈ ΠΊΠ²Π°Π΄ΡΠ°Ρ, Π½ΠΎ ΡΠΎΡΠΌΠ° β ΡΡΠΎ Π°Π±ΡΡΡΠ°ΠΊΡΠΈΡ, ΠΊΠΎΡΠΎΡΡΡ Π½Π΅Π²ΠΎΠ·ΠΌΠΎΠΆΠ½ΠΎ ΠΈΠ·ΠΎΠ±ΡΠ°Π·ΠΈΡΡ.
ΠΠ»Π°ΡΡ Circle ΠΏΡΠΎΠΈΠ·Π²ΠΎΠ΄ΠΈΡΡΡ ΠΎΡ ΠΊΠ»Π°ΡΡΠ° Shape, ΠΈ Π² Π½Π΅ΠΌ Π·Π°ΠΌΠ΅ΡΠ°ΡΡΡΡ ΡΡΠΈ Π²ΠΈΡΡΡΠ°Π»ΡΠ½ΡΡ ΠΌΠ΅ΡΠΎΠ΄Π°. ΠΠ±ΡΠ°ΡΠΈΡΠ΅ Π²Π½ΠΈΠΌΠ°Π½ΠΈΠ΅, ΡΡΠΎ Π² Π΄Π°Π½Π½ΠΎΠΌ ΡΠ»ΡΡΠ°Π΅ Π½Π΅Ρ Π½Π΅ΠΎΠ±Ρ ΠΎΠ΄ΠΈΠΌΠΎΡΡΠΈ ΠΈΡΠΏΠΎΠ»ΡΠ·ΠΎΠ²Π°ΡΡ ΠΊΠ»ΡΡΠ΅Π²ΠΎΠ΅ ΡΠ»ΠΎΠ²ΠΎ virtual, ΠΏΠΎΡΠΊΠΎΠ»ΡΠΊΡ Π²ΠΈΡΡΡΠ°Π»ΡΠ½ΠΎΡΡΡ ΡΡΠ½ΠΊΡΠΈΠΉ Π½Π°ΡΠ»Π΅Π΄ΡΠ΅ΡΡΡ Π² ΠΏΡΠΎΠΈΠ·Π²ΠΎΠ΄Π½ΠΎΠΌ ΠΊΠ»Π°ΡΡΠ΅. Π’Π΅ΠΌ Π½Π΅ ΠΌΠ΅Π½Π΅Π΅ Π΄Π»Ρ Π½Π°ΠΏΠΎΠΌΠΈΠ½Π°Π½ΠΈΡ ΠΎ Π²ΠΈΡΡΡΠ°Π»ΡΠ½ΠΎΡΡΠΈ ΠΈΡΠΏΠΎΠ»ΡΠ·ΡΠ΅ΠΌΡΡ ΡΡΠ½ΠΊΡΠΈΠΉ Π½Π΅ Π»ΠΈΡΠ½ΠΈΠΌ Π±ΡΠ΄Π΅Ρ ΡΠ²Π½ΠΎ ΡΠΊΠ°Π·Π°ΡΡ ΡΡΠΎ.
ΠΠ»Π°ΡΡ Square ΠΏΡΠΎΠΈΠ·Π²ΠΎΠ΄ΠΈΡΡΡ ΠΎΡ ΠΊΠ»Π°ΡΡΠ° Rectangle ΠΈ Π½Π°ΡΠ»Π΅Π΄ΡΠ΅Ρ ΠΎΡ Π½Π΅Π³ΠΎ Π²ΡΠ΅ ΠΌΠ΅ΡΠΎΠ΄Ρ, ΠΏΡΠΈΡΠ΅ΠΌ ΠΌΠ΅ΡΠΎΠ΄ GetPerim() Π·Π°ΠΌΠ΅ΡΠ°Π΅ΡΡΡ Π² Π½ΠΎΠ²ΠΎΠΌ ΠΊΠ»Π°ΡΡΠ΅.
ΠΡΠ΅ ΠΌΠ΅ΡΠΎΠ΄Ρ Π΄ΠΎΠ»ΠΆΠ½Ρ ΡΡΠ½ΠΊΡΠΈΠΎΠ½ΠΈΡΠΎΠ²Π°ΡΡ Π½ΠΎΡΠΌΠ°Π»ΡΠ½ΠΎ Π² ΠΏΡΠΎΠΈΠ·Π²ΠΎΠ΄Π½ΡΡ ΠΊΠ»Π°ΡΡΠ°Ρ , Π½ΠΎ Π½Π΅ Π² Π±Π°Π·ΠΎΠ²ΠΎΠΌ ΠΊΠ»Π°ΡΡΠ΅ Shape, ΠΏΠΎΡΠΊΠΎΠ»ΡΠΊΡ Π½Π΅Π²ΠΎΠ·ΠΌΠΎΠΆΠ½ΠΎ ΡΠΎΠ·Π΄Π°ΡΡ ΡΠΊΠ·Π΅ΠΌΠΏΠ»ΡΡ ΡΠΎΡΠΌΡ ΠΊΠ°ΠΊ ΡΠ°ΠΊΠΎΠ²ΠΎΠΉ. ΠΡΠΎΠ³ΡΠ°ΠΌΠΌΠ° Π΄ΠΎΠ»ΠΆΠ½Π° Π±ΡΡΡ Π·Π°ΡΠΈΡΠ΅Π½Π° ΠΎΡ ΠΏΠΎΠΏΡΡΠΊΠΈ ΠΏΠΎΠ»ΡΠ·ΠΎΠ²Π°ΡΠ΅Π»Ρ ΡΠΎΠ·Π΄Π°ΡΡ ΠΎΠ±ΡΠ΅ΠΊΡ ΡΡΠΎΠ³ΠΎ ΠΊΠ»Π°ΡΡΠ°. ΠΠ»Π°ΡΡ Shape ΡΡΡΠ΅ΡΡΠ²ΡΠ΅Ρ ΡΠΎΠ»ΡΠΊΠΎ Π΄Π»Ρ ΡΠΎΠ³ΠΎ, ΡΡΠΎΠ±Ρ ΠΏΠΎΠ΄Π΄Π΅ΡΠΆΠΈΠ²Π°ΡΡ ΠΈΠ½ΡΠ΅ΡΡΠ΅ΠΉΡ, ΠΎΠ±ΡΠΈΠΉ Π΄Π»Ρ Π²ΡΠ΅Ρ ΠΏΡΠΎΠΈΠ·Π²ΠΎΠ΄Π½ΡΡ ΠΊΠ»Π°ΡΡΠΎΠ², ΠΏΠΎΡΡΠΎΠΌΡ ΠΎΠ± ΡΡΠΎΠΌ ΡΠΈΠΏΠ΅ Π΄Π°Π½Π½ΡΡ Π³ΠΎΠ²ΠΎΡΡΡ ΠΊΠ°ΠΊ ΠΎΠ± Π°Π±ΡΡΡΠ°ΠΊΡΠ½ΠΎΠΌ, ΠΈΠ»ΠΈ ADT (Abstract Data Π’ΡΡΠ΅).
ΠΠ±ΡΡΡΠ°ΠΊΡΠ½ΡΠΉ ΠΊΠ»Π°ΡΡ Π΄Π°Π½Π½ΡΡ ΠΏΡΠ΅Π΄ΡΡΠ°Π²Π»ΡΠ΅Ρ ΠΎΠ±ΡΡΡ ΠΊΠΎΠ½ΡΠ΅ΠΏΡΠΈΡ, ΡΠ°ΠΊΡΡ ΠΊΠ°ΠΊ ΡΠΎΡΠΌΠ°, Π° Π½Π΅ ΠΎΡΠ΄Π΅Π»ΡΠ½ΡΠ΅ ΠΎΠ±ΡΠ΅ΠΊΡΡ, ΡΠ°ΠΊΠΈΠ΅ ΠΊΠ°ΠΊ ΠΎΠΊΡΡΠΆΠ½ΠΎΡΡΡ ΠΈΠ»ΠΈ ΠΊΠ²Π°Π΄ΡΠ°Ρ. Π C++ ADT ΠΏΠΎ ΠΎΡΠ½ΠΎΡΠ΅Π½ΠΈΡ ΠΊ Π΄ΡΡΠ³ΠΈΠΌ ΠΊΠ»Π°ΡΡΠ°ΠΌ Π²ΡΠ΅Π³Π΄Π° Π²ΡΡΡΡΠΏΠ°Π΅Ρ ΠΊΠ°ΠΊ Π±Π°Π·ΠΎΠ²ΡΠΉ, Π΄Π»Ρ ΠΊΠΎΡΠΎΡΠΎΠ³ΠΎ Π½Π΅Π²ΠΎΠ·ΠΌΠΎΠΆΠ½ΠΎ ΡΠΎΠ·Π΄Π°ΡΡ ΡΡΠ½ΠΊΡΠΈΠΎΠ½Π°Π»ΡΠ½ΡΠΉ ΠΎΠ±ΡΠ΅ΠΊΡ Π°Π±ΡΡΡΠ°ΠΊΡΠ½ΠΎΠ³ΠΎ ΠΊΠ»Π°ΡΡΠ°.
Π§ΠΈΡΡΡΠ΅ Π²ΠΈΡΡΡΠ°Π»ΡΠ½ΡΠ΅ ΡΡΠ½ΠΊΡΠΈΠΈ
C++ ΠΏΠΎΠ΄Π΄Π΅ΡΠΆΠΈΠ²Π°Π΅Ρ ΡΠΎΠ·Π΄Π°Π½ΠΈΠ΅ Π°Π±ΡΡΡΠ°ΠΊΡΠ½ΡΡ ΡΠΈΠΏΠΎΠ² Π΄Π°Π½Π½ΡΡ Ρ ΡΠΈΡΡΡΠΌΠΈ Π²ΠΈΡΡΡΠ°Π»ΡΠ½ΡΠΌΠΈ ΡΡΠ½ΠΊΡΠΈΡΠΌΠΈ. Π§ΠΈΡΡΡΠΌΠΈ Π²ΠΈΡΡΡΠ°Π»ΡΠ½ΡΠΌΠΈ ΡΡΠ½ΠΊΡΠΈΡΠΌΠΈ Π½Π°Π·ΡΠ²Π°ΡΡΡΡ ΡΠ°ΠΊΠΈΠ΅, ΠΊΠΎΡΠΎΡΡΠ΅ ΠΈΠ½ΠΈΡΠΈΠ°Π»ΠΈΠ·ΠΈΡΡΡΡΡΡ Π½ΡΠ»Π΅Π²ΡΠΌ Π·Π½Π°ΡΠ΅Π½ΠΈΠ΅ΠΌ, Π½Π°ΠΏΡΠΈΠΌΠ΅Ρ:
virtual void Draw() = 0;
ΠΠ»Π°ΡΡ, ΡΠΎΠ΄Π΅ΡΠΆΠ°ΡΠΈΠΉ ΡΠΈΡΡΡΠ΅ Π²ΠΈΡΡΡΠ°Π»ΡΠ½ΡΠ΅ ΡΡΠ½ΠΊΡΠΈΠΈ, ΡΠ²Π»ΡΠ΅ΡΡΡ ADT. ΠΠ΅Π²ΠΎΠ·ΠΌΠΎΠΆΠ½ΠΎ ΡΠΎΠ·Π΄Π°ΡΡ ΠΎΠ±ΡΠ΅ΠΊΡ Π΄Π»Ρ ΠΊΠ»Π°ΡΡΠ°, ΠΊΠΎΡΠΎΡΡΠΉ ΡΠ²Π»ΡΠ΅ΡΡΡ ADT. ΠΠΎΠΏΡΡΠΊΠ° ΡΠΎΠ·Π΄Π°Π½ΠΈΡ ΠΎΠ±ΡΠ΅ΠΊΡΠ° Π΄Π»Ρ ΡΠ°ΠΊΠΎΠ³ΠΎ ΠΊΠ»Π°ΡΡΠ° Π²ΡΠ·ΠΎΠ²Π΅Ρ ΡΠΎΠΎΠ±ΡΠ΅Π½ΠΈΠ΅ ΠΎΠ± ΠΎΡΠΈΠ±ΠΊΠ΅ Π²ΠΎ Π²ΡΠ΅ΠΌΡ ΠΊΠΎΠΌΠΏΠΈΠ»ΡΡΠΈΠΈ. ΠΠΎΠΌΠ΅ΡΠ΅Π½ΠΈΠ΅ Π² ΠΊΠ»Π°ΡΡ ΡΠΈΡΡΠΎΠΉ Π²ΠΈΡΡΡΠ°Π»ΡΠ½ΠΎΠΉ ΡΡΠ½ΠΊΡΠΈΠΈ Π±ΡΠ΄Π΅Ρ ΠΎΠ·Π½Π°ΡΠ°ΡΡ ΡΠ»Π΅Π΄ΡΡΡΠ΅Π΅:
β’ Π½Π΅Π²ΠΎΠ·ΠΌΠΎΠΆΠ½ΠΎΡΡΡ ΡΠΎΠ·Π΄Π°Π½ΠΈΡ ΠΎΠ±ΡΠ΅ΠΊΡΠ° ΡΡΠΎΠ³ΠΎ ΠΊΠ»Π°ΡΡΠ°;
β’ Π½Π΅ΠΎΠ±Ρ ΠΎΠ΄ΠΈΠΌΠΎΡΡΡ Π·Π°ΠΌΠ΅ΡΠ΅Π½ΠΈΡ ΡΠΈΡΡΠΎΠΉ Π²ΠΈΡΡΡΠ°Π»ΡΠ½ΠΎΠΉ ΡΡΠ½ΠΊΡΠΈΠΈ Π² ΠΏΡΠΎΠΈΠ·Π²ΠΎΠ΄Π½ΠΎΠΌ ΠΊΠ»Π°ΡΡΠ΅.
ΠΡΠ±ΠΎΠΉ ΠΊΠ»Π°ΡΡ, ΠΏΡΠΎΠΈΠ·Π²Π΅Π΄Π΅Π½Π½ΡΠΉ ΠΎΡ ADT, ΡΠ½Π°ΡΠ»Π΅Π΄ΡΠ΅Ρ ΠΎΡ Π½Π΅Π³ΠΎ ΡΠΈΡΡΡΡ Π²ΠΈΡΡΡΠ°Π»ΡΠ½ΡΡ ΡΡΠ½ΠΊΡΠΈΡ, ΠΊΠΎΡΠΎΡΡΡ Π½Π΅ΠΎΠ±Ρ ΠΎΠ΄ΠΈΠΌΠΎ Π±ΡΠ΄Π΅Ρ Π·Π°ΠΌΠ΅ΡΡΠΈΡΡ, ΡΡΠΎΠ±Ρ ΠΏΠΎΠ»ΡΡΠΈΡΡ Π²ΠΎΠ·ΠΌΠΎΠΆΠ½ΠΎΡΡΡ ΡΠΎΠ·Π΄Π°Π²Π°ΡΡ ΠΎΠ±ΡΠ΅ΠΊΡΡ ΡΡΠΎΠ³ΠΎ ΠΊΠ»Π°ΡΡΠ°. Π’Π°ΠΊ, Π΅ΡΠ»ΠΈ ΠΊΠ»Π°ΡΡ Rectangle Π½Π°ΡΠ»Π΅Π΄ΡΠ΅ΡΡΡ ΠΎΡ ΠΊΠ»Π°ΡΡΠ° Shape, ΠΊΠΎΡΠΎΡΡΠΉ ΡΠΎΠ΄Π΅ΡΠΆΠΈΡ ΡΡΠΈ ΡΠΈΡΡΡΠ΅ Π²ΠΈΡΡΡΠ°Π»ΡΠ½ΡΠ΅ ΡΡΠ½ΠΊΡΠΈΠΈ, ΡΠΎ Π² ΠΊΠ»Π°ΡΡΠ΅ Rectangle Π΄ΠΎΠ»ΠΆΠ½Ρ Π±ΡΡΡ Π·Π°ΠΌΠ΅ΡΠ΅Π½Ρ Π²ΡΠ΅ ΡΡΠΈ ΡΡΠΈ ΡΡΠ½ΠΊΡΠΈΠΈ, ΠΈΠ½Π°ΡΠ΅ ΠΎΠ½ ΡΠΎΠΆΠ΅ Π±ΡΠ΄Π΅Ρ ADT. Π Π»ΠΈΡΡΠΈΠ½Π³Π΅ 13.8 ΠΈΠ·ΠΌΠ΅Π½Π΅Π½ΠΎ ΠΎΠ±ΡΡΠ²Π»Π΅Π½ΠΈΠ΅ ΠΊΠ»Π°ΡΡa Shape ΡΠ°ΠΊΠΈΠΌ ΠΎΠ±ΡΠ°Π·ΠΎΠΌ, ΡΡΠΎΠ±Ρ ΠΎΠ½ ΡΡΠ°Π» Π°Π±ΡΡΡΠ°ΠΊΡΠ½ΡΠΌ ΡΠΈΠΏΠΎΠΌ Π΄Π°Π½Π½ΡΡ . ΠΡΡΠ°Π»ΡΠ½Π°Ρ ΡΠ°ΡΡΡ Π»ΠΈΡΡΠΈΠ½Π³Π° 13.7 Π½Π΅ ΠΈΠ·ΠΌΠ΅Π½ΠΈΠ»Π°ΡΡ, ΠΏΠΎΡΡΠΎΠΌΡ Π½Π΅ ΠΏΡΠΈΠ²ΠΎΠ΄ΠΈΡΡΡ. ΠΡΠΎΡΡΠΎ Π·Π°ΠΌΠ΅Π½ΠΈΡΠ΅ ΠΎΠ±ΡΡΠ²Π»Π΅Π½ΠΈΠ΅ ΠΊΠ»Π°ΡΡΠ° Π² ΡΡΡΠΎΠΊΠ°Ρ 7β16 Π»ΠΈΡΡΠΈΠ½Π³Π° 13.7 Π»ΠΈΡΡΠΈΠ½Π³ΠΎΠΌ 13.8 ΠΈ Π·Π°ΠΏΡΡΡΠΈΡΠ΅ ΠΏΡΠΎΠ³ΡΠ°ΠΌΠΌΡ.
ΠΠΈΡΡΠΈΠ½Π³ 13.8. ΠΠ±ΡΡΡΠ°ΠΊΡΠ½ΡΠ΅ ΡΠΈΠΏΡ Π΄Π°Π½Π½ΡΡ
1: ΠΊΠ»Π°ΡΡ Shape
2: {
3: public:
4: Shape(){ }
5: ~Shape(){ }.
6: virtual long GetArea() = 0; // ΠΎΡΠΈΠ±ΠΊΠ°
7: virtual long GetPerim()= 0;
8: virtual void Draw() = 0;
9: private:
10: };
Π Π΅Π·ΡΠ»ΡΡΠ°Ρ:
(1)Circle (2)Rectangle (3)Square (0)Quit: 2
x x x x x x
x x x x x x
x x x x x x
x x x x x x
(1)Circle (2)Rectangle (3)Square (0)Quit: 3
x x x x x
x x x x x
x x x x x
x x x x x
x x x x x
(1)Circle (2)Rectangle (3)Square (0)Quit: 0
ΠΠ½Π°Π»ΠΈΠ·: ΠΠ°ΠΊ Π²ΠΈΠ΄ΠΈΡΠ΅, Π²ΡΠΏΠΎΠ»Π½Π΅Π½ΠΈΠ΅ ΠΏΡΠΎΠ³ΡΠ°ΠΌΠΌΡ Π½Π΅ ΠΈΠ·ΠΌΠ΅Π½ΠΈΠ»ΠΎΡΡ. ΠΡΠΎΡΡΠΎ ΡΠ΅ΠΏΠ΅ΡΡ Π² ΠΏΡΠΎΠ³ΡΠ°ΠΌΠΌΠ΅ Π½Π΅Π²ΠΎΠ·ΠΌΠΎΠΆΠ½ΠΎ ΡΠΎΠ·Π΄Π°ΡΡ ΠΎΠ±ΡΠ΅ΠΊΡ ΠΊΠ»Π°ΡΡΠ° Shape.
ΠΠ±ΡΡΡΠ°ΠΊΡΠ½ΡΠ΅ ΡΠΈΠΏΡ Π΄Π°Π½Π½ΡΡ