Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > Delphi: Общие вопросы > переопределение vs. сокрытие


Автор: tubik 16.9.2008, 22:05
Доброго времени суток. Собственно, вопрос больше относиться к теории. Но хотелось бы разобраться в следующем (следующий фрагмент взят из хэлпа Delphi 7):

If a method declaration specifies the same method identifier and parameter signature as an inherited method, but doesn't include override, the new declaration merely hides the inherited one without overriding it. Both methods exist in the descendant class, where the method name is statically bound. For example,

Код

type
 T1 = class(TObject)
   procedure Act; virtual;
 end;
 T2 = class(T1)
   procedure Act;  // Act is redeclared, but not overridden
 end;
var
 SomeObject: T1;
begin
 SomeObject := T2.Create;
 SomeObject.Act;  // calls T1.Act
end;



M
Alexeis
Модератор: используйте подсветку кода.


Вопрос заключается в следующем - кто кого в этом примере прячет (hides)? Возможно, пример кода не сильно удачный для того что бы подтвердить слова - "the new declaration merely hides the inherited one without overriding it". Помогите пожалуйста уяснить данный момент. Буду очень благодарен за пример кода демонстрирующий данный нюанс - оverriding vs hiding
Просто в приведенном примере кода из хелпа - SomeObject.Act; - дейсвтительно вызывается T1.Act. Так при каких обстоятельствах T2.Act будет скрывать T1.Act? Приведите пример кода пожалуйста.

Автор: Louken 16.9.2008, 22:14
Код

type
 T1 = class(TObject)
   procedure Act; virtual;
 end;
 T2 = class(T1)
   procedure Act; override;
 end;
var
 SomeObject: T1;
begin
 SomeObject := T2.Create;
 SomeObject.Act;  // calls T1.Act
end;

Теперь будет вызываться T2.Act

Автор: tubik 16.9.2008, 22:38
Цитата(Louken @  16.9.2008,  22:14 Найти цитируемый пост)
Теперь будет вызываться T2.Act 


В приведенном тобой примере, происходит переопределение а не сокрытие.. ты добавил директиву override в определение метода Act класса Т2

Автор: aktuba 16.9.2008, 22:59
Ты скрываешь метод класса T2, т.к. создаешь объект класса T1: SomeObject: T1;
Может я и ошибаюсь, но это первое, что пришло в голову.

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)