Главная страница
Top.Mail.Ru    Яндекс.Метрика
Текущий архив: 2007.04.29;
Скачать: CL | DM;

Вниз

Наследник   Найти похожие ветки 

 
KOSS ©   (2007-02-26 22:27) [0]

Добрый вечер господа-программеры! Как перекрыть методы и свойства родителя при создании класса-наследника.


 
Юрий Зотов ©   (2007-02-26 23:51) [1]

Свойства - никак, они невиртуальны.

Статические методы - тоже никак. На то они и статические.

Виртуальные и динамические методы - переобъявлением метода в новом классе с описателем override.


 
DimaBr   (2007-02-27 08:59) [2]

Свойства "перекрываются" путём перекрытия методов свойств

TClass1 = class
 protected
   function GetA: integer; virtual;
   procedure SetA(const Value: integer);virtual;
 public
   property A: integer read GetA write SetA;
end;

TClass2 = class(TClass1)
 protected
   function GetA: integer; override;
   procedure SetA(const Value: integer);override;
end;


 
icWasya ©   (2007-02-27 12:08) [3]

На свойства можно ещё назначить другие обработчики

TClass3 = class(TClass2)
protected
  procedure NewSetA(const Value: integer);
public
 property A: write NewSetA;

end;


 
Юрий Зотов ©   (2007-02-27 12:50) [4]

> DimaBr   (27.02.07 08:59) [2]

Если эти методы не статические. А если статические - никак.

> icWasya ©   (27.02.07 12:08) [3]

Проверьте, что получится:

var
 Obj: TClass2;
begin
 Obj := TClass3.Create;
 try
   Obj.A := 3; // *
 finally
   Obj.Free;
 end;
end;

В строке, помеченной звездочкой, будет вызван SetA, а не NewSetA. Но если переменную Obj объявить, как TClass3, то будет вызван NewSetA. А если переменную Obj объявить, как TClass3, но привести ее к типу TClass2:
TClass2(Obj).A := 3;
то снова будет вызван SetA.

Получаем неоднозначное поведение объекта. А бедняга программер, использующий такой класс, получает отличный шанс нарваться на завуалированную (и потому трудновылавливаемую) ошибку. И после того, как он ее все же выловит (если вообще выловит), я хотел бы послушать, что он скажет в адрес разработчика класса.

Думаю, это шоу будет незабываемым.


 
trubin ©   (2007-02-27 13:02) [5]

Если в потомке есть метод, с тем же именем, что и статический метод родителя, то даже к статическому методу родителя можно обратиться через "inherited"


 
Amoeba ©   (2007-03-01 15:21) [6]

Кстати, просто к слову. У Р.Конопки есть пример перекрытия св-ва родителя в потомке с обращением к нему через inherited в методе доступа у потомка.


 
Ш-К   (2007-03-01 19:25) [7]

Юрий Зотов ©   (27.02.07 12:50) [4]

Как в одном известном фильме: "Есть эти ягоды можно, только отравишься".


 
evvcom ©   (2007-03-02 08:53) [8]

> [5] trubin ©   (27.02.07 13:02)

Вопрос-то не о том.



Страницы: 1 вся ветка

Текущий архив: 2007.04.29;
Скачать: CL | DM;

Наверх




Память: 0.48 MB
Время: 0.052 c
2-1175802409
jimmo
2007-04-05 23:46
2007.04.29
Структура базы данных для учета аппаратуры в ремонте


2-1176053929
Baffi
2007-04-08 21:38
2007.04.29
отчет в Excel


15-1175616774
Scorpio1985
2007-04-03 20:12
2007.04.29
Ищу работу


15-1175672948
mambo_dev
2007-04-04 11:49
2007.04.29
Подзабыл(


15-1175740495
Slider007
2007-04-05 06:34
2007.04.29
С днем рождения ! 5 апреля