Главная страница
    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.04 c
15-1175714512
X-ecuto[rus]
2007-04-04 23:21
2007.04.29
Есть ли какое-нибудь


2-1175855454
voe
2007-04-06 14:30
2007.04.29
Определение типа данных.


2-1175940604
Officeman
2007-04-07 14:10
2007.04.29
CheckListBox для тех кто в танке


15-1175169498
Kolan
2007-03-29 15:58
2007.04.29
Опрос для пользователей DMClient.


15-1175840061
Anubis2
2007-04-06 10:14
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
Английский Французский Немецкий Итальянский Португальский Русский Испанский