Главная страница
Top.Mail.Ru    Яндекс.Метрика
Текущий архив: 2007.05.13;
Скачать: 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 вся ветка

Текущий архив: 2007.05.13;
Скачать: CL | DM;

Наверх




Память: 0.5 MB
Время: 0.046 c
2-1177312593
vitv
2007-04-23 11:16
2007.05.13
Ошибка при передаче параметра в запрос


11-1159283659
Моторокер
2006-09-26 19:14
2007.05.13
Int2Str vs. IntToStr


3-1172081609
IOrist
2007-02-21 21:13
2007.05.13
Работа с компонентом IBDataSet


15-1176389969
Kerk
2007-04-12 18:59
2007.05.13
Защищенные процессы Висты оказались не слишком защищенными


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