![]() |
| ||
|
|
Новости |
Поиск |
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 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'а - нет полиморфизма.
> Полученный результат - это оно так и надо или же это баг
> такой?
ИМХО - это баг языка.