Главная страница
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.041 c
15-1175610559
PHPdeveloper
2007-04-03 18:29
2007.04.29
как спрятать текстовое поле в чудом окне


15-1175409027
Roman_S
2007-04-01 10:30
2007.04.29
Новый компонент без описания и комментариев


15-1175480795
Slider007
2007-04-02 06:26
2007.04.29
С днем рождения ! 31 марта


11-1152569152
ANTPro
2006-07-11 02:05
2007.04.29
Unpacker для KOL


2-1175754669
_max_
2007-04-05 10:31
2007.04.29
tcp & peerport