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 23:23:00) [1]


> han_malign  

возможно, всегда путаю эти термины


han_malign   (2011-10-25 18:20:00) [2]


> Это просто синтаксис. Test не связан с классом никак, кроме как синтаксически.

- семантика...


vuk   (2011-10-25 16:07:00) [3]

to oxffff ©   (25.10.11 15:45) [24]:

> Этого можно достичь на

Можно, но property было бы удобнее.


oxffff   (2011-10-25 15:45:00) [4]


> vuk ©   (25.10.11 14:57) [23]
> to oxffff ©   (25.10.11 13:22) [21]:
>
> > На уровне экземпляра
> >
> > procedure
> > procedure   virtual;
>
> не хватает propery


Речь идет о методах.


> > На уровне метакласса
> >
> > class procedure
> > class procedure virtual;
>
> class propery должно быть здесь (IMHO)
>
>


Этого можно достичь на

> > class procedure
> > class procedure virtual;


vuk   (2011-10-25 14:57:00) [5]

to oxffff ©   (25.10.11 13:22) [21]:

> На уровне экземпляра
>
> procedure
> procedure   virtual;

не хватает propery


> На уровне метакласса
>
> class procedure
> class procedure virtual;

class propery должно быть здесь (IMHO)


oxffff   (2011-10-25 13:24:00) [6]


> vuk ©   (25.10.11 13:20) [20]
> to oxffff ©   (25.10.11 13:16) [17]:
>
> > Реально путаница для class и class static c точки зрения
>
> > функционирования.
>
> С точки зрения функционирования путаница не там, а в привязке
> class property к class static в качестве аксессоров.


Я о том, что слово class перед procedure у static и вводит людей в заблуждение.


oxffff   (2011-10-25 13:22:00) [7]

Здесь аналогия

На уровне экземпляра

procedure
procedure   virtual;

На уровне метакласса

class procedure
class procedure virtual;

На следующем за  метаклассом уровне

class procedure static


vuk   (2011-10-25 13:20:00) [8]

to oxffff ©   (25.10.11 13:16) [17]:

> Реально путаница для class и class static c точки зрения
> функционирования.

С точки зрения функционирования путаница не там, а в привязке class property к class static в качестве аксессоров.


oxffff   (2011-10-25 13:20:00) [9]


> vuk ©   (25.10.11 13:17) [18]


Тогда просто не нужно объявлять его как static и будет полное счастье.

Объяви просто

class procedure Test;


vuk   (2011-10-25 13:17:00) [10]

to oxffff ©   (25.10.11 13:14) [16]:

> Поэтому ее использование некорректно. для этого нужно переписать
> так.

В аксессор свойства я дополнительный параметр передать не смогу.


oxffff   (2011-10-25 13:16:00) [11]


> oxffff ©   (25.10.11 13:14) [16]
>
> > vuk ©   (25.10.11 13:06) [15]
>
>
> Здесь не вполне удачно выбрано именование.


Реально путаница для class и class static c точки зрения функционирования.


oxffff   (2011-10-25 13:14:00) [12]


> vuk ©   (25.10.11 13:06) [15]


Здесь не вполне удачно выбрано именование.
Поскольку

class procedure Test; static;
является глобальной обычной процедурой в рамках всего семейства классов.
Поэтому ее использование некорректно. для этого нужно переписать так.

TClassClass = class of TClass;

class procedure Test(classintance:TClassClass);static;
begin
classintance.ClassVirtual();
end;


vuk   (2011-10-25 13:06:00) [13]

to oxffff ©   (25.10.11 13:02) [14]:

> Я  в коде не увидел слова property.

Ну так я ж написал - аксессорами class property могут быть только static методы. Дальше - демонстрация того, что используя их нельзя реализовать полиморфное поведение.


oxffff   (2011-10-25 13:02:00) [14]


> vuk ©   (25.10.11 12:34) [12]
> to Плохиш ©   (25.10.11 11:50) [11]:
>
> > Какой смысл перегружать статические методы?
>
> Я вроде в начале написал, чего именно я хотел - полиморфное
> свойство, которое будет работать на уровне метакласса.


Я  в коде не увидел слова property.


oxffff   (2011-10-25 13:01:00) [15]


> vuk ©   (24.10.11 23:55) [1]
> Для иллюстрации "фигни":


Работает as designed.


vuk   (2011-10-25 12:34:00) [16]

to Плохиш ©   (25.10.11 11:50) [11]:

> Какой смысл перегружать статические методы?

Я вроде в начале написал, чего именно я хотел - полиморфное свойство, которое будет работать на уровне метакласса. Методы и конструкторы-то работают. А вот свойства - нифига. И я вроде бы не хочу чего-то странного...


Плохиш   (2011-10-25 11:50:00) [17]

Какой смысл перегружать статические методы?
Весь сокровенный смысл статических членов класса - это группирование глобальных переменных/функций, ну и ещё для всяких религиозных языков громко рассказывать, что в них нет глобальных переменных и это круто.


DVM   (2011-10-25 11:23:00) [18]


> vuk ©   (25.10.11 10:52) [9]


> Вот тут согласен!

Да почему это баг?

Допустим, есть отдельно стоящая свободная процедура (как я уже писал), внутри которой мы обращаемся к классовому методу заранее известного класса:

procedure Test;
begin
 TClass1.ClassVirtual;
end;


Ясное дело, что будет вызван метод именно класса TClass1, а не какого либо его предка или потомка, по другому и быть не может.

Статический классовый метод это именно такая процедура, просто синтаксис ее объявления позволяет поместить ее внутрь класса и все.
Любые обращения из нее к классовым методам и классовым полям класса в котором она находится можно делать без указания имени класса (даже несмотря на то, что в нее ссылка на класс не передается), но не более того.
При компиляции все будет преобразовано в вид аналогичный приведенному выше.


vuk   (2011-10-25 10:52:00) [19]

to jack128_   (25.10.11 08:00) [8]:

> Нет Self'а - нет полиморфизма.

Это понятно, нет ручек - нет мультиков. А хочется. :)


> ИМХО - это баг языка.

Вот тут согласен!


jack128_   (2011-10-25 08:00:00) [20]


> P.S. Я догадываюсь, конечно, что это потому, что у class
> static нет self.

тогда откуда вопрос?? Очевидно - ничего нельзя сделать. Нет Self'а - нет полиморфизма.

> Полученный результат - это оно так и надо или же это баг
> такой?

ИМХО - это баг языка.


Страницы:   1 2

Наверх

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