Помощь - Поиск - Пользователи - Календарь
Полная версия: инкапсуляция в ООП
Форум «Всё о Паскале» > Современный Паскаль и другие языки > Делфи
Svetlana
Здравствуйте! Собственно как он действует я знаю,но проблемы всё равно возникли. Есть несколько(5) классов,точнее иерархия классов. И при объявлении в родительском (самом первом) классе раздела Protected программа перестает компилироваться. Каждый класс описан в своём модуле. Не знаю где ошибка.
volvo
Цитата
программа перестает компилироваться
по какой причине? Какая часть программы? Сам модуль, в который добавлена protected-секция, или остальные модули? Что компилятор говорит? Если ты попытаешься обратиться извне (не из методов класса и его наследников, а из простых процедур/функций) к методам/данным описанным в разделе protected, то ошибка, собственно, и должна быть. Для этого и вводились защищенные члены.

Компилятор, как я понимаю, FPC? Или Дельфи? Куда тему-то передвигать? Я к тому, что Турбо-Паскаль не имеет понятия о защищенном разделе, Protected нельзя использовать, он просто не известен компилятору.

Да, кстати, чтобы не гадать на кофейной гуще - все-таки, лучше бы присоединить проект.
Svetlana
Ошибка возникает в самой програме (а не в модулях) в процедуру Create ,несоответствие праметров



program Ierarh;{Придумайте и разработайте иерархию классов на предмете
"средство передвижения". В иерархии должно быть не менее трех уровней,должны
определяться методы, должны быть использованы все модификаторы доступа,
и т.д. Кроме того, должен быть
написан тестирующий класс (или метод), демонстрирующий все возможности
иерархии}



{$APPTYPE CONSOLE}

uses
SysUtils,
vehicleunit in 'vehicleunit.pas',
carunit in 'carunit.pas',
sportunit in 'sportunit.pas',
familyunit in 'familyunit.pas',
BMW in 'BMW.pas';




//объявляем переменные
var vehicle:Tvehicle;
car:Tcar;
sportcar:TSportCar;
familycar:TFamilyCar;
sportcarBMW:TSportCarBMW;
Speed,PassCount,EngineCount:byte;
Transmission,Mark,Color:string;


begin
//работа с объектом Средство пережвижения
writeln('FOR VEHICLE:');
vehicle:=Tvehicle.Create(Speed,PassCount);
vehicle.TakePassanger;
vehicle.MoveFaster;
vehicle.MoveSlower;
vehicle.destroy;

//работа с объектом Машина
writeln('FOR CAR:');
car:=TCar.Create(Speed,PassCount,Color,Mark);
car.TakeColor;
car.TakeMark;
car.MoveFaster; //переопредёлёные методы
car.MoveSlower;
car.TakePassanger;
car.Destroy;


//работа с объектом СемейнМашина
writeln('FOR FAMILYCAR:');
FamilyCar:=TFamilyCar.Create(Speed,PassCount,Color,Mark);
FamilyCar.TakeColor;
FamilyCar.TakeMark;
FamilyCar.MoveFaster; //родительские методы
FamilyCar.MoveSlower;
FamilyCar.TakePassanger;
FamilyCar.Destroy;


//работа с объектом СпортМашина
writeln('FOR SPORTCAR:');
SportCar:=TSportCar.Create(Speed,PassCount,Color,Mark);
SportCar.TakeColor;
SportCar.TakeMark;
SportCar.TakePassanger; //переопределяем второй раз
SportCar.MoveFaster;
SportCar.MoveSlower;
SportCar.Destroy;

//работа с объектом СпортМашинаBMW
writeln('FOR SPORTCARBMW:');
sportcarBMW:= TSportCarBMW.Create(Speed,PassCount,Color,Mark);
sportcarBMW.TakeCost;
sportcarBMW.Destroy;

readln;
end.










volvo
Я ж написал тебе, что происходит:
Цитата
Если ты попытаешься обратиться извне (не из методов класса и его наследников, а из простых процедур/функций) к методам/данным описанным в разделе protected, то ошибка, собственно, и должна быть.
Ты пытаешься обратиться к защищенному конструктору TVehicle.Create из основной программы. Это невозможно: доступ к этому конструктору возможен только из наследников TVehicle. А в твоем случае компилятор, понимая, что защищенный конструктор недоступен, пытается вызвать дефолтный конструктор TObject.Create, который без параметров (я надеюсь, ты знаешь, что все классы - наследники TObject?). Отсюда и такая ошибка.

P.S. Значит, все-таки Дельфи. Переезжаем...
Это текстовая версия — только основной контент. Для просмотра полной версии этой страницы, пожалуйста, нажмите сюда.