Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "Основная";
Текущий архив: 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.038 c
2-1175854943
=Guest=
2007-04-06 14:22
2007.04.29
Объявление функции


15-1175795915
vasIZmax
2007-04-05 21:58
2007.04.29
Диспечер устройств


2-1175946045
Temp_Yuriy
2007-04-07 15:40
2007.04.29
Изменение положения объектов в зависимости от размера формы


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


2-1175778447
Adolf
2007-04-05 17:07
2007.04.29
из делфи в эксель!!!





Afrikaans Albanian Arabic Armenian Azerbaijani Basque Belarusian Bulgarian Catalan Chinese (Simplified) Chinese (Traditional) Croatian Czech Danish Dutch English Estonian Filipino Finnish French
Galician Georgian German Greek Haitian Creole Hebrew Hindi Hungarian Icelandic Indonesian Irish Italian Japanese Korean Latvian Lithuanian Macedonian Malay Maltese Norwegian
Persian Polish Portuguese Romanian Russian Serbian Slovak Slovenian Spanish Swahili Swedish Thai Turkish Ukrainian Urdu Vietnamese Welsh Yiddish Bengali Bosnian
Cebuano Esperanto Gujarati Hausa Hmong Igbo Javanese Kannada Khmer Lao Latin Maori Marathi Mongolian Nepali Punjabi Somali Tamil Telugu Yoruba
Zulu
Английский Французский Немецкий Итальянский Португальский Русский Испанский