Здравствуйте! Собственно как он действует я знаю,но проблемы всё равно возникли. Есть несколько(5) классов,точнее иерархия классов. И при объявлении в родительском (самом первом) классе раздела Protected программа перестает компилироваться. Каждый класс описан в своём модуле. Не знаю где ошибка.
по какой причине? Какая часть программы? Сам модуль, в который добавлена protected-секция, или остальные модули? Что компилятор говорит? Если ты попытаешься обратиться извне (не из методов класса и его наследников, а из простых процедур/функций) к методам/данным описанным в разделе protected, то ошибка, собственно, и должна быть. Для этого и вводились защищенные члены.
Компилятор, как я понимаю, FPC? Или Дельфи? Куда тему-то передвигать? Я к тому, что Турбо-Паскаль не имеет понятия о защищенном разделе, Protected нельзя использовать, он просто не известен компилятору.
Да, кстати, чтобы не гадать на кофейной гуще - все-таки, лучше бы присоединить проект.
Ошибка возникает в самой програме (а не в модулях) в процедуру 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;
Если ты попытаешься обратиться извне (не из методов класса и его наследников, а из простых процедур/функций) к методам/данным описанным в разделе protected, то ошибка, собственно, и должна быть.
Ты пытаешься обратиться к защищенному конструктору TVehicle.Create из основной программы. Это невозможно: доступ к этому конструктору возможен только из наследников TVehicle. А в твоем случае компилятор, понимая, что защищенный конструктор недоступен, пытается вызвать дефолтный конструктор TObject.Create, который без параметров (я надеюсь, ты знаешь, что все классы - наследники TObject?). Отсюда и такая ошибка.