Версия для печати темы

Нажмите сюда для просмотра этой темы в обычном формате

Форум «Всё о Паскале» _ Делфи _ инкапсуляция в ООП

Автор: Svetlana 4.11.2009 20:50

Здравствуйте! Собственно как он действует я знаю,но проблемы всё равно возникли. Есть несколько(5) классов,точнее иерархия классов. И при объявлении в родительском (самом первом) классе раздела Protected программа перестает компилироваться. Каждый класс описан в своём модуле. Не знаю где ошибка.

Автор: volvo 4.11.2009 21:17

Цитата
программа перестает компилироваться
по какой причине? Какая часть программы? Сам модуль, в который добавлена protected-секция, или остальные модули? Что компилятор говорит? Если ты попытаешься обратиться извне (не из методов класса и его наследников, а из простых процедур/функций) к методам/данным описанным в разделе protected, то ошибка, собственно, и должна быть. Для этого и вводились защищенные члены.

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

Да, кстати, чтобы не гадать на кофейной гуще - все-таки, лучше бы присоединить проект.

Автор: Svetlana 4.11.2009 21:46

Ошибка возникает в самой програме (а не в модулях) в процедуру 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.













Прикрепленные файлы
Прикрепленный файл  vehicleunit.pas ( 1.13 килобайт ) Кол-во скачиваний: 274
Прикрепленный файл  carunit.pas ( 1.62 килобайт ) Кол-во скачиваний: 287
Прикрепленный файл  familyunit.pas ( 670 байт ) Кол-во скачиваний: 268
Прикрепленный файл  sportunit.pas ( 469 байт ) Кол-во скачиваний: 278
Прикрепленный файл  BMW.pas ( 623 байт ) Кол-во скачиваний: 256

Автор: volvo 4.11.2009 21:56

Я ж написал тебе, что происходит:

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

P.S. Значит, все-таки Дельфи. Переезжаем...