Top.Mail.Ru
Мастера DELPHI, Delphi programming community Титульная страница Поиск, карта сайта Написать письмо 
| Новости | Поиск | FAQ | Статьи | Книги | Новости VCL |
| Форумы ЧАТ | Орешник | KOL и MCK |
Форумы -» Основная («Начинающим»)/ Базы / WinAPI / Компоненты / Сети / Media / Игры / Corba и COM / KOL / FreePascal / .Net / Прочее / RSDN.ORG

« предыдущая ветвь | форум | следующая ветвь »

Инкапсуляция [D7, XP]


John Doe ©   (2005-11-08 16:50:00) 

Здраствуйте.
Вот код:

type
 TCar = class(TObject)
   private
     Acceleration: Word;
     Speed:        Word;
     Grip:         Word;
     Durability:   Word;
 end;

 TMitsubishi = class(TCar)
 protected
   Model: Word ;
 end;

var
 Form1: TForm1;

implementation

{$R *.dfm}

procedure TForm1.Button1Click(Sender: TObject);
var NewCar: TMitsubishi;
begin
 NewCar.Acceleration:=4;
end;


Не пойму.
Я имею возможность изменить значение поля Acceleration,через обьект-потомок класса.
Но в то же время,ведь обьявил поля класса TCar,в разделе [B]private[/B],а не protected.
Доступ он давать не должен,вроде...

Читаю М.В.Сухарев,"Основы Delphi-Профессиональный подход":
...."целостность данных не может быть на-
рушена вызывающими подпрограммами, [B]если только они не находятся в
одном модуле с описываемым классом[/B], то есть, в данном"...
А если мне надо,чтоб никто не видел поля TCar,независимо от модуля,в котором этот класс

описан.Что тогда делать.
Заранее спасибо.


Игорь Шевченко   (2005-11-08 18:05:00) [1]


> А если мне надо,чтоб никто не видел поля TCar,независимо
> от модуля,в котором этот класс


Это надо версию Delphi 2005, там в языке появился модификатор strict, который и делает то, что тебе надо.

Для того, чтобы решить проблему в ранних версиях, достаточно просто вынести объявления классов в отдельный модуль.


Digitman   (2005-11-08 17:11:00) [2]


> John Doe ©   (08.11.05 17:07) [5]


да и логика тоже страдает)

поле Model, по всей очевидности должно быть объявлено отнюдь не в TMitsubishi, а в некоем TBrandnameCar, который, в свою очередь, будет прямым или непрямым наследником TCar... а уж TMitsubishi будет прямым или непрямым наследником TBrandnameCar


John Doe   (2005-11-08 17:07:00) [3]


> вплоть до end.

:-)
Это я не в редакторе кода писал.

Ну что ж.
Спасибо всем.


Digitman   (2005-11-08 17:04:00) [4]


> Кстати,а никто и не заметил ошибки


вплоть до end., который ты тоже, кстати, не написал, у тебя там м.б. еще туева хуча ошибок) ... но к сабжу они вряд ли имеют отношение


John Doe   (2005-11-08 17:03:00) [5]


> Не давать дописывать код в свой модуль

В таком случае,придется создать специальный юнит для классов,интерфейсов итд. итп.

PS.Кстати,а никто и не заметил ошибки.
Я не создал обьект.
NewCar:=TMitsubishi.Create;
:-)


Внук   (2005-11-08 16:53:00) [6]

Не давать дописывать код в свой модуль :)


Digitman   (2005-11-08 16:53:00) [7]


> Доступ он давать не должен,вроде


доступ к private-членам класса имеет любой , кто находится в ТОМ же юните, что и тот самый класс


Наверх

Титульная страница Поиск, карта сайта Написать письмо