![]() |
| ||
|
|
Новости |
Поиск |
FAQ |
Статьи |
Книги |
Новости VCL
| | Форумы ЧАТ |
Орешник |
|
| |||
| |||
« предыдущая ветвь | форум | следующая ветвь »
class property и виртуальные методы
vuk © (2011-10-24 23:44:00)Delphi XE. Пытаюсь сделать class property с возможностью перегрузки в наследнике. Получаю следующее - аксессоры могут быть только class static, что не дает возможности их перегрузить. Пытаюсь изнутри этих методов обращаться к классовым виртуальным методам, но получается фигня, потому, что обратиться к методам потомка не выходит.
Есть какой-либо выход из такой ситуации?
P.S. Я догадываюсь, конечно, что это потому, что у class static нет self.
DVM (2011-10-25 00:43:00) [21]
> Полученный результат - это оно так и надо
я не вижу тут бага никакого
vuk (2011-10-25 00:22:00) [22]Из help:
Class Static Methods
Like class methods, class static methods can be accessed without an object reference. Unlike ordinary class methods, class static methods have no Self parameter at all. They also cannot access any instance members. ( They still have access to class fields, class properties, and class methods.) Also unlike class methods, class static methods cannot be declared virtual.
vuk (2011-10-25 00:18:00) [23]Ну я это, собственно, и так подозреваю, что это из-за отсутствия self у class static. Вопрос возникает. Полученный результат - это оно так и надо или же это баг такой?
DVM (2011-10-25 00:11:00) [24]
> procedure TClass1.Test;
> begin
> TClass1.ClassVirtual;
> end;
я хотел сказать:
procedure Test;
begin
TClass1.ClassVirtual;
end;
DVM (2011-10-25 00:10:00) [25]
> DVM © (25.10.11 00:03) [2]
Это я к чему, после компиляции, имхо, эта статическая классовая процедура будет тем же самым, что например:
procedure TClass1.Test;
begin
TClass1.ClassVirtual;
end;
DVM (2011-10-25 00:03:00) [26]
> vuk ©
class procedure TClass1.Test;
begin
ClassVirtual;
end;
У тебя Test статическая, в нее не передается ссылка на класс (не Self, ссылка на экземпляр, а ссылка на класс). Внутри этого метода нет никакой информации о том, к какому классу он относится. Это просто синтаксис. Test не связан с классом никак, кроме как синтаксически.
vuk (2011-10-24 23:55:00) [27]Для иллюстрации "фигни":
program Project1;
{$APPTYPE CONSOLE}
uses
SysUtils;
type
TClass1 = class
protected
class procedure ClassVirtual; virtual;
public
class procedure Test; static;
end;
TClass2 = class(TClass1)
protected
class procedure ClassVirtual; override;
end;
{ TClass1 }
class procedure TClass1.ClassVirtual;
begin
writeln('TClass1.ClassVirtual');
end;
class procedure TClass1.Test;
begin
ClassVirtual;
end;
{ TClass2 }
class procedure TClass2.ClassVirtual;
begin
writeln('TClass2.ClassVirtual');
end;
begin
try
TClass2.Test;
except
on E: Exception do
Writeln(E.ClassName, ': ', E.Message);
end;
readln;
end.