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

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

Перекрытие метода.. [D2005, 2000]


pathfinder ©   (2007-04-25 10:29:00) 

Добрый день!

Подскажите, пожалуйста, почему при перекрытии статического метода, новый код перекрытого метода в классе потомке может игнорироваться компилятором?


pathfinder   (2007-04-25 12:41:00) [1]


> Я в [8] привёл пример для места программы, в котором известны
> оба класса и создаётся экземпляр нового класса, но выполняется
> метод родителя.


type
 IdFtp=class(...)
...
protected
 procedure IsSiteZONESupported;
...
public
 function connect;
...
end;

TMyIdFtp2=class(TIdFtp)
protected
 procedure IsSiteZONESupported;
end;

var
 FTP2: TMyIdFtp2;

function TIdFtp.Connect: Boolean;
begin
...
IsSiteZONESupported;
...
end;

procedure TMyIdFtp2.IsSiteZONESupported;
begin
 New code...
end;

Проблема в том, что IsSiteZONESupported вызывается из метода Connect, поэтому при вызове FTP2.Connect вызывается именно TIdFtp.IsSiteZONESupported.


Плохиш   (2007-04-25 12:27:00) [2]


> pathfinder ©   (25.04.07 12:24) [10]

Я в [8] привёл пример для места программы, в котором известны оба класса и создаётся экземпляр нового класса, но выполняется метод родителя.


pathfinder   (2007-04-25 12:24:00) [3]


> Неправильный вывод.


Почему?

TIdFtp.IsSiteZONESupported вызывается в методе TIdFtp.Connect.
Если я в TMyIdFtp2 создаю новый метод TMyIdFtp2.IsSiteZONESupported, то в TMyIdFtp2.Connect будет по прежнему вызываться TIdFtp.IsSiteZONESupported. Или это как-то можно обойти?


Плохиш   (2007-04-25 12:12:00) [4]


> pathfinder ©   (25.04.07 10:57) [7]


> Правда тут есть один нюанс, это происходит не при непосредственном
> вызове метода, а когда он вызывается методом уже существующем
> в классе-родителе.
> Ну да..все правильно, я же создаю его только в классе-потомке,
>  а одноименный метод в классе-родителе не меняется.

Неправильныйвывод.


Плохиш   (2007-04-25 12:10:00) [5]


> pathfinder ©   (25.04.07 10:29)  
> Добрый день!
>
> Подскажите, пожалуйста, почему при перекрытии статического
> метода, новый код перекрытого метода в классе потомке может
> игнорироваться компилятором?

Если нет приведения типа к новому классу. Пр.

type
TMyIdFtp2=class(TIdFtp)
protected
  function IsSiteZONESupported : Boolean;
end;

function TMyIdFtp2.IsSiteZONESupported: Boolean;
begin
New code...
end;
.....
var idFtp: TidFtp;
begin
 idFtp := TMTMyIdFtp2.Create...

 idFtp.IsSiteZONESupported // будет вызван метод TIdFtp.IsSiteZONESupported

 TMTMyIdFtp2(idFtp).IsSiteZONESupported // будет вызван метод TMTMyIdFtp2.IsSiteZONESupported

end;


pathfinder   (2007-04-25 10:57:00) [6]

Правда тут есть один нюанс, это происходит не при непосредственном вызове метода, а когда он вызывается методом уже существующем в классе-родителе.
Ну да..все правильно, я же создаю его только в классе-потомке, а одноименный метод в классе-родителе не меняется. Прошу прощения, вопрос закрыт:)


pathfinder   (2007-04-25 10:40:00) [7]


>
> и как вы это определили?


по синим точкам напротив каждой строки для которой компилятор создает машинный код.. ну и в режиме отладки это видно


umbra   (2007-04-25 10:37:00) [8]


> однако при компиляции используется метод

и как вы это определили?


pathfinder   (2007-04-25 10:35:00) [9]

type
 TMyIdFtp2=class(TIdFtp)
 protected
   function IsSiteZONESupported : Boolean;
 end;

function TMyIdFtp2.IsSiteZONESupported: Boolean;
begin
 New code...
end;

однако при компиляции используется метод
function TIdFTP.IsSiteZONESupported: Boolean;
begin
...
end;


_Аноним   (2007-04-25 10:31:00) [10]

Ну например, если его никто не вызывает


umbra   (2007-04-25 10:31:00) [11]

а пример можно, когда он игнорируется компилятором?


MBo   (2007-04-25 10:31:00) [12]

покажи код


Наверх

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