![]() |
| ||
|
|
Новости |
Поиск |
FAQ |
Статьи |
Книги |
Новости VCL
| | Форумы ЧАТ |
Орешник |
|
| |||
| |||
« предыдущая ветвь | форум | следующая ветвь »
Перекрытие метода.. [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]покажи код