Форум: "Начинающим";
Текущий архив: 2007.05.13;
Скачать: [xml.tar.bz2];
ВнизПерекрытие метода.. Найти похожие ветки
← →
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;
Скачать: [xml.tar.bz2];
Память: 0.47 MB
Время: 0.05 c