Top.Mail.Ru
Мастера DELPHI, Delphi programming community Титульная страница Поиск, карта сайта Написать письмо 
| Новости | Поиск | FAQ | Статьи | Книги | Новости VCL |
| Форумы ЧАТ | Орешник | KOL и MCK |
Форумы -» Основная («Начинающим»)/ Базы / WinAPI / Компоненты / Сети / Media / Игры / Corba и COM / KOL / FreePascal / .Net / Прочее / RSDN.ORG

« предыдущая ветвь | форум | следующая ветвь »

переопределение vs. сокрытие [D7, WinXP]


Страницы:   1 2

tubik ©   (2008-09-16 22:17:00) 

Доброго времени суток. Собственно, вопрос больше относиться к теории. Но хотелось бы разобраться в следующем (следующий фрагмент взят из хэлпа 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 hidesthe 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;

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


Медвежонок Пятачок   (2008-09-16 23:16:00) [21]

печатает T2, хотя, казалось бы, должна печатать T1

С чего бы вдруг.
переменная типа T2. Метод статический. Вызывается сразу T2.Act и больше ничего не вызывается


Медвежонок Пятачок   (2008-09-16 23:12:00) [22]

Просто в приведенном примере кода из хелпа - SomeObject.Act; - дейсвтительно вызывается T1.Act. Так при каких обстоятельствах T2.Act будет скрывать T1.Act? Приведите пример кода пожалуйста.

t2.act статическая
t1.act виртуальная.

кроме того, они еще и одноименные.

вызов статического метода зависит от типа переменной.
вызов виртуального зависит от типа объекта, на который указывает переменная.

плюс еще в этом примере разорвана цепочка так как метод не имеет директивы override.

Чего спрашивал-то? По-русски только.


palva   (2008-09-16 23:11:00) [23]

Что-то я в недоумении. Программа
{$APPTYPE CONSOLE}
type
T1 = class(TObject)
  procedure Act; virtual;
end;
T2 = class(T1)
  procedure Act;  // Act is redeclared, but not overridden
end;
procedure T1.Act; begin writeln('T1') end;
procedure T2.Act; begin writeln('T2') end;
var
SomeObject: T2;
begin
SomeObject := T2.Create;
(SomeObject As T1).Act;  // T2
end.

печатает T2, хотя, казалось бы, должна печатать T1
Компилятор D7, предупреждение при компиляции выдается...
Как много нам открытий чудных...


palva   (2008-09-16 23:03:00) [24]


> Так при каких обстоятельствах T2.Act будет скрывать T1.Act?

Будет скрывать, если мы напишем
SomeObject: T2;
Но даже в этом случае можно вызвать родительский метод
T1(SomeObject).Act;


palva   (2008-09-16 22:57:00) [25]

Скрывает, значит функция остается, и из объекта T2 можно обратиться как к T1.Act, так и к T1.Act. Если же override, то поднявшись от объекта T2 к родителю мы обнаружим, что функция Act в нем заменена, а старой функции уже не существует.


tubik   (2008-09-16 22:54:00) [26]

Оригинальный ответ... Возможно не совсем корректно задал вопрос. То что T2.Act хайдс T1.Act я понимаю (об этом говорится в фрагменте из хелпа). Просто в приведенном примере кода из хелпа - SomeObject.Act; - дейсвтительно вызывается T1.Act. Так при каких обстоятельствах T2.Act будет скрывать T1.Act? Приведите пример кода пожалуйста.


Медвежонок Пятачок   (2008-09-16 22:19:00) [27]

T2.Act хайдс T1.Act


Страницы:   1 2

Наверх

Титульная страница Поиск, карта сайта Написать письмо