Бьерн Страуструп. Язык программирования С++ Второе дополненное издание



Pdf көрінісі
бет31/256
Дата11.07.2022
өлшемі2,87 Mb.
#37591
1   ...   27   28   29   30   31   32   33   34   ...   256
1.2.4 Пределы абстракции данных 
Абстрактный тип данных определяется как некий "черный ящик". После своего определения он по сути 
никак не взаимодействует с программой. Его никак нельзя приспособить для новых целей, не меняя 
определения. В этом смысле это негибкое решение. Пусть, например, нужно определить для 
графической системы тип shape (фигура). Пока считаем, что в системе могут быть такие фигуры: 
окружность (circle), треугольник (triangle) и квадрат (square). Пусть уже есть определения точки и цвета: 
class point { /* ... */ }; 
class color { /* ... */ }; 
Тип shape можно определить следующим образом: 
enum kind { circle, triangle, square }; 
class shape 

point 
center; 
color 
col; 
kind 
k; 
// представление фигуры 
public: 
point where () { return center; } 
void move ( point to ) { center = to; draw (); } 
void 
draw 
(); 
void rotate ( int ); 
// еще некоторые операции 
}; 
"Поле типа" k необходимо для того, чтобы такие операции, как draw () и rotate (), могли определять, с 
какой фигурой они имеют дело (в языках вроде Паскаля можно использовать для этого запись с 
вариантами, в которой k является полем-дескриминантом). Функцию draw () можно определить так: 
void shape :: draw () 

switch ( k ) 

case 
circle: 
// рисование окружности 
break; 
case 
triangle: 
// рисование треугольника 
break; 
case 
square: 
// рисование квадрата 
break; 


Это не функция, а кошмар. В ней нужно учесть все возможные фигуры, какие только есть. Поэтому она 
дополняется новыми операторами, как только в системе появляется новая фигура. Плохо то, что после 
определения новой фигуры нужно проверить и, возможно, изменить все старые операции класса. 
Поэтому, если вам недоступен исходный текст каждой операции класса, ввести новую фигуру в систему 
просто невозможно. Появление любой новой фигуры приводит к манипуляциям с текстом каждой 
существенной операции класса. Требуется достаточно высокая квалификация, чтобы справиться с этой 
задачей, но все равно могут появиться ошибки в уже отлаженных частях программы, работающих со 
старыми фигурами. Возможность выбора представления для конкретной фигуры сильно сужается, если 
требовать, чтобы все ее представления укладывались в уже заданный формат, специфицированный 
общим определением фигуры (т.е. определением типа shape). 


Бьерн Страуструп.
Язык программирования С++ 
 
28 


Достарыңызбен бөлісу:
1   ...   27   28   29   30   31   32   33   34   ...   256




©emirsaba.org 2024
әкімшілігінің қараңыз

    Басты бет