Вниз
Скачать: CL | DM;

Перекрытие метода..   Найти похожие ветки 

 
pathfinder ©   (2007-04-25 10:29) [0]

Добрый день!

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


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

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


 
umbra ©   (2007-04-25 10:31) [2]

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


 
MBo ©   (2007-04-25 10:31) [3]

покажи код


 
pathfinder ©   (2007-04-25 10:35) [4]

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

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

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


 
umbra ©   (2007-04-25 10:37) [5]


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

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


 
pathfinder ©   (2007-04-25 10:40) [6]


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


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


 
pathfinder ©   (2007-04-25 10:57) [7]

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


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


> 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;


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


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


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

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


 
pathfinder ©   (2007-04-25 12:24) [10]


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


Почему?

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


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


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

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


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


> Я в [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.



Страницы: 1 вся ветка

Скачать: CL | DM;



Память: 0.48 MB
Время: 0.075 c
2-1177143314
Roman_S
2007-04-21 12:15
2007.05.13
как отображать процесс копирования КАТАЛОГОВ


1-1173864928
kyn66
2007-03-14 12:35
2007.05.13
Правильно-ли работает RandomRange ?


2-1177360993
Jeeb
2007-04-24 00:43
2007.05.13
База Аксес


2-1177420765
Kostafey
2007-04-24 17:19
2007.05.13
Игра с формами


15-1176712162
homm
2007-04-16 12:29
2007.05.13
7600GT vs X1650PRO




   Наверх