Главная страница
    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.06 c
15-1175720351
Германн
2007-04-05 00:59
2007.04.29
Не долго музыка играла :(((


3-1171012448
svt
2007-02-09 12:14
2007.04.29
Подскажите пожайлуста, как сделать выборку с использованием


9-1148897218
аматор
2006-05-29 14:06
2007.04.29
каким образом создать модель?


3-1170860196
valua
2007-02-07 17:56
2007.04.29
Хранимая процедура : выбор записей + количество по полю


15-1175435176
isasa
2007-04-01 17:46
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
Английский Французский Немецкий Итальянский Португальский Русский Испанский