Top.Mail.Ru
Мастера DELPHI, Delphi programming community Титульная страница Поиск, карта сайта Написать письмо 
| Новости | Поиск | FAQ | Статьи | Книги | Новости VCL |
| Форумы ЧАТ | Орешник | KOL и MCK |
Форумы -» Основная («Начинающим»)/ Базы / WinAPI / Компоненты / Сети / Media / Игры / Corba и COM / KOL / FreePascal / .Net / Прочее / RSDN.ORG

« предыдущая ветвь | форум | следующая ветвь »

class property и виртуальные методы


Страницы:   1 2

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.


Страницы:   1 2

Наверх

Титульная страница Поиск, карта сайта Написать письмо