|
Программирование >> Дополнительные возможности наследования
Например, предположим, что класс Horse производится от двух классов - Animal и Displayable, причем последний добавляет только новые методы, но не содержит данных. В таком случае все наследуемые данные класса Horse происходят только от одного базового класса Animal, а методы наследуются от обоих классов. Классы-мандаты (capability class) иногда еше называют миксинами (mixin). Этот термин произошел от названия десерта, представляющего собой смесь пирожного с мороженым, политую сверху шоколадной глазурью. Этот десерт продавался в супермаркетах Sommerville в штате Массачусетс. Видимо, это блюдо когда-то попробовал один из профаммистов, занимающийся разработкой средств объектно-ориентированного профаммирования для языка SCOOPS, где этот термин впервые появился. йОсшракгоиыв топы данных в объектном профаммировании довольно часто создаются иерархии логически связанных классов. Например, представим класс Shape, от которого произведены классы Rectangle и Circle. Затем от класса Rectangle производится класс Square, как частный вид прямоугольника. В каждом из производных классов замещаются методы Draw(), GetAreaO и др. Основной костяк программы с классом Shape и производными от него Rectangle и Circle показан в листинге 13.7. Шшм 13.7. Киассы ccMclcfflBi Skapi Листинг 13.7. Классы семейства Shape ftinclude <iostream.h> class Shape { public: ShapeO{ } virtual Shape(){ } virtual long GetAreaO { return -1; } virtual long GetPerimO { return -1; } virtual void Draw() { } private: } ; class Circle : public Shape { public: Circle(int radius):itsRadius(radius){ } Circle(){ } long GetAreaO { return 3 * itsRadius * itsRadius; } long GetPerimO { return 6 itsRadius; } void DrawO; private: int itsRadius; 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 int itsCircumference; void Circle::Draw() { cout Circle drawing routine here!\ n ; class Rectangle : public Shape { public: Rectangle(int len, int width): ,* Г * itsLength(len), itsWidth(width){ } virtual Rectangle(){ } virtual long GetAreaO { return itsLength itsWidth; } virtual long GetPerim() { return 2*itsLength + 2*itsWidth; } virtual int GetLengthO { return itsLength; } virtual int GetWidthO { return itsWidth; } virtual void Draw(); private: int itsWidth; int itsLength; void Rectangle;:Draw() { for (int 1 = 0; KitsLength; 1++) { for (int j = 0; j<itsWidth; j++) cout x ; cout \ n ; > > class Square : public Rectangle { public: Square(int len); Square(int len, int width); Square(){ } long GetPerimO { return 4 * GetLength(); > Square::Square(int len): Rectangle(len,len) Square::Square(int len, int width): 77: Rectangleden,width) 78: 79: { 80: if (GetLengthO != GetWidthO) 81: cout Error, not a square... a Rectangle??\ n ; 82: > 84: int mainO 85: { 86: int choice; 87: bool fOuit = false; 88: Shape * sp; 90; while ( ! fOuit ) 91: { 92: cout (l)Circle (2)Rectangle (3)Square (O)Quit: ; 93: cin choice; 95: switch (choice) 96: { 97: case 0: fOuit = true; 98: break; 99: case 1: sp = new Gircle(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(! fOuit) 110: sp->Draw(); 111: delete sp; 112: cout \ n ; 113: } 114; return 0; 115: } (DCircle (2)Rectangle (3)Square (O)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 (l)Gircle (2)Rectangle (3)Square (0)Quit:3 X X X X X
|
© 2006 - 2025 pmbk.ru. Генерация страницы: 0
При копировании материалов приветствуются ссылки. |