Бьерн Страуструп.
Язык программирования С++
44
{
//
...
public:
void
prompt
();
//
...
};
Здесь в базовом классе window член inside типа Rectangle описывается как защищенный (protected), но
функции-члены производных классов, например, dumb_terminal::prompt(), могут обратиться к нему и
выяснить, с какого вида окном они работают. Для всех других функций член window::inside недоступен.
В
таком подходе сочетается высокая степень защищенности (действительно, вряд ли вы "случайно"
определите производный класс) с гибкостью, необходимой для программ, которые создают классы и
используют их иерархию (действительно, "для себя" всегда можно в
производных классах
предусмотреть доступ к защищенным членам).
Неочевидное следствие из этого: нельзя составить полный и окончательный список всех функций,
которым будет доступен защищенный член, поскольку всегда можно добавить еще одну, определив ее
как функцию-член в новом производном классе. Для
метода абстракции данных такой подход часто
бывает мало приемлемым. Если язык ориентируется на метод абстракции данных, то очевидное для
него решение - это
требование указывать в описании класса список всех функций, которым нужен
доступ к члену. В С++ для этой цели используется описание частных (private) членов. Оно
использовалось и в приводившихся описаниях классов complex и shape.
Важность инкапсуляции, т.е. заключения членов в защитную оболочку, резко возрастает с
ростом
размеров программы и увеличивающимся разбросом областей приложения. В $$6.6 более подробно
обсуждаются возможности языка по инкапсуляции.
Достарыңызбен бөлісу: