Форум: "Основная";
Текущий архив: 2007.04.29;
Скачать: [xml.tar.bz2];
ВнизНаследник Найти похожие ветки
← →
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;
Скачать: [xml.tar.bz2];
Память: 0.46 MB
Время: 0.04 c