IPB
ЛогинПароль:

> ВНИМАНИЕ!

Прежде чем задать вопрос, смотрите FAQ.
Рекомендуем загрузить DRKB.

Наладить общение поможет, если вы подпишитесь по почте на новые темы в этом форуме.

 
 Ответить  Открыть новую тему 
> инкапсуляция в ООП, как действует раздел Protected
сообщение
Сообщение #1


Новичок
*

Группа: Пользователи
Сообщений: 24
Пол: Женский

Репутация: -  0  +


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


Гость






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

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

Да, кстати, чтобы не гадать на кофейной гуще - все-таки, лучше бы присоединить проект.
 К началу страницы 
+ Ответить 
сообщение
Сообщение #3


Новичок
*

Группа: Пользователи
Сообщений: 24
Пол: Женский

Репутация: -  0  +


Ошибка возникает в самой програме (а не в модулях) в процедуру 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 килобайт ) Кол-во скачиваний: 168
Прикрепленный файл  carunit.pas ( 1.62 килобайт ) Кол-во скачиваний: 169
Прикрепленный файл  familyunit.pas ( 670 байт ) Кол-во скачиваний: 156
Прикрепленный файл  sportunit.pas ( 469 байт ) Кол-во скачиваний: 164
Прикрепленный файл  BMW.pas ( 623 байт ) Кол-во скачиваний: 157
 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 
сообщение
Сообщение #4


Гость






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

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

 Ответить  Открыть новую тему 
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0

 





- Текстовая версия 29.10.2020 13:01
500Gb HDD, 6Gb RAM, 2 Cores, 7 EUR в месяц — такие хостинги правда бывают
Связь с администрацией: bu_gen в домене octagram.name