![]() |
| ||
|
|
Новости |
Поиск |
FAQ |
Статьи |
Книги |
Новости VCL
| | Форумы ЧАТ |
Орешник |
|
| |||
| |||
« предыдущая ветвь | форум | следующая ветвь »
Наследник [D7, WinXP]
KOSS © (2007-02-26 22:27:00)Добрый вечер господа-программеры! Как перекрыть методы и свойства родителя при создании класса-наследника.
evvcom (2007-03-02 08:53:00) [1]> [5] trubin © (27.02.07 13:02)
Вопрос-то не о том.
Ш-К (2007-03-01 19:25:00) [2]Юрий Зотов © (27.02.07 12:50) [4]
Как в одном известном фильме: "Есть эти ягоды можно, только отравишься".
Amoeba (2007-03-01 15:21:00) [3]Кстати, просто к слову. У Р.Конопки есть пример перекрытия св-ва родителя в потомке с обращением к нему через inheritedв методе доступа у потомка.
trubin (2007-02-27 13:02:00) [4]Если в потомке есть метод, с тем же именем, что и статический метод родителя, то даже к статическому методу родителя можно обратиться через " inherited"
Юрий Зотов (2007-02-27 12:50:00) [5]> 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.
Получаем неоднозначное поведение объекта. А бедняга программер, использующий такой класс, получает отличный шанс нарваться на завуалированную (и потому трудновылавливаемую) ошибку. И после того, как он ее все же выловит (если вообще выловит), я хотел бы послушать, что он скажет в адрес разработчика класса.
Думаю, это шоу будет незабываемым.
icWasya (2007-02-27 12:08:00) [6]На свойства можно ещё назначить другие обработчики
TClass3 = class(TClass2)
protected
procedure NewSetA(const Value: integer);
public
property A: write NewSetA;
end;
DimaBr (2007-02-27 08:59:00) [7]Свойства "перекрываются" путём перекрытия методов свойств
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;
Юрий Зотов (2007-02-26 23:51:00) [8]Свойства - никак, они невиртуальны.
Статические методы - тоже никак. На то они и статические.
Виртуальные и динамические методы - переобъявлением метода в новом классе с описателем override.