powered by simpleCommunicator - 2.0.61     © 2026 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / Delphi [игнор отключен] [закрыт для гостей] / Generics, как объявлять класс-потомок от заданного T?
17 сообщений из 42, страница 2 из 2
Generics, как объявлять класс-потомок от заданного T?
    #39987195
kapas
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Kazantsev Alexey,

Kazantsev AlexeyХелперы в дельфях это хелперы курильщика (как и дженерики). Хелперы здорового человека, опять же, во Free Pascal.

А поподробнее можно...?
...
Рейтинг: 0 / 0
Generics, как объявлять класс-потомок от заданного T?
    #39987198
Kazantsev Alexey
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
kapas
А поподробнее можно...?

Хелпер в дельфях перекрывает собою любые другие, во Free Pascal они объединяются.
...
Рейтинг: 0 / 0
Generics, как объявлять класс-потомок от заданного T?
    #39987205
kapas
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Kazantsev Alexey,
Наследование class helper'ов есть. Вполне себе хорошо работает. Об этом уже выше было сказано. Что касается record helper'ов - это так необходимо?

К тому же это в Delphi сделать возможно:

Код: pascal
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
type
  TRecordA = record helper for <ordinal> | record | array type;
  ...
  THelperRecordA = record helper for TRecordA
  ...
  end; 
  
  TRecordB = type TRecordA;

  THelperRecordB = record helper for TRecordB
    ...
     function Some();
  end; 

var
   A: TRecordA;
....
  THelperRecordB(A).Some();
  
  
...
Рейтинг: 0 / 0
Generics, как объявлять класс-потомок от заданного T?
    #39987211
Kazantsev Alexey
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
kapas
Наследование class helper'ов есть

Речь не о наследовании. Один хелпер в одном модуле, другой в другом. Подключаем оба модуля...
...
Рейтинг: 0 / 0
Generics, как объявлять класс-потомок от заданного T?
    #39987217
white_nigger
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Kazantsev Alexey
Речь не о наследовании. Один хелпер в одном модуле, другой в другом. Подключаем оба модуля...
Странный класс, к которому вынуждены лепить кучу хелперов...
...
Рейтинг: 0 / 0
Generics, как объявлять класс-потомок от заданного T?
    #39987219
rgreat
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Kazantsev Alexey,

Создай тикет в ембаркадере. Проголосуем.
...
Рейтинг: 0 / 0
Generics, как объявлять класс-потомок от заданного T?
    #39987222
ResourceSpace
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
kapas
ошибка компиляции закономерна
Ошибка компиляции не закономерна, так как гласит не "что-то не так с разными типами конструкторов" - а "тут должен быть класс" , когда это как раз-таки и есть класс.
alekcvp
получается класс с разными типами конструкторов
И что? Когда я объявлю переменную конкретного типа и стану создавать объект этого конкретного типа - на этот момент всё будет уже чётко известно.
Kazantsev Alexey
Free Pascal так умеет.
Ха! Спасибо за информацию!
Проверил на 2.0.4 - хоть и аналогично ругается (плюс нафик ломаются выпадающие подсказки), но при этом при сборке спокойно компилирует и всё работает как задумывалось))
Красафчики, просто красафчики!) Всегда на шаг впереди))
_Vasilisk_
Смотреть исходники
Они, как бы, далеко не всегда доступны-то...
_Vasilisk_
...only for class helper...
Тьфу... Мой переводчик проглотил слово "class" и обратил в ничто... А я даже не заметил, сам балда) Спасибо что ткнули мордачкой)) :3

но... Но тогда это какая-то официальная лажа...
Допустим мне требуется свой хэлпер для String, при этом не повреждая системный TStringHelper...
И мне официально запрещают сделать??:
Код: pascal
1.
TMyStringHelper = record helper(TStringHelper) for String

Не говоря уже про несколько разных из разных модулей...
...
Рейтинг: 0 / 0
Generics, как объявлять класс-потомок от заданного T?
    #39987224
Kazantsev Alexey
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
white_nigger
Странный класс, к которому вынуждены лепить кучу хелперов...

Ничего странного. Просто ситуации бывают разными.

rgreat
Создай тикет в ембаркадере.

А уже есть, вроде. Надо будет поискать.

ResourceSpace
Проверил на 2.0.4

Это же релиз 2006 года. Раритет, однако. Последний релиз 3.2.
...
Рейтинг: 0 / 0
Generics, как объявлять класс-потомок от заданного T?
    #39987228
alekcvp
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
ResourceSpace

alekcvp
получается класс с разными типами конструкторов
И что? Когда я объявлю переменную конкретного типа и стану создавать объект этого конкретного типа - на этот момент всё будет уже чётко известно.

Когда объявишь класс - да, а если ты объявишь процедуру, которая принимает твой класс и создаёт его динамически внутре - откуда компилятору узнать какой конструктор надо вызывать, сколько у него параметров и т.п.?..
Код: pascal
1.
2.
3.
4.
procedure InitMyClass(var MyClass: TObject; Base: TClass);
begin
  MyClass := TMyClass<Base>.Create; // ???!!!
end;
...
Рейтинг: 0 / 0
Generics, как объявлять класс-потомок от заданного T?
    #39987229
ResourceSpace
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
kapas
сделать возможно

Долго писал пост, не видел этого сообщения. Сейчас изучим... Но выглядит больше как какой-то хак...
Kazantsev Alexey
Раритет, однако.

Не, это Lazarus'а версия, пардон что запутал. :) А сам FPC - 3.0.4.
...
Рейтинг: 0 / 0
Generics, как объявлять класс-потомок от заданного T?
    #39987232
kapas
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
ResourceSpace,

1. ResourceSpaceОшибка компиляции не закономерна, так как гласит не "что-то не так с разными типами конструкторов" - а "тут должен быть класс", когда это как раз-таки и есть класс.

Подумайте лучше, что будет если то о чем здесь говорилось будет реализовано в языке: как вы будете, например, решать проблему с конфликтов имен методов, или рекурсией при определении класса (скажем вот так TClassA = class(TNewType<TClassA>)...end; // некоторые "разработчики" могут захотеть такой "красоты" :-)))

Я подозреваю что здесь еще существуют проблемы с реализацией такой конструкции в компиляторе...

2.

Код: pascal
1.
TMyStringHelper = record helper (TStringHelper) for String



Что мешает сделать как я писал выше:

Код: pascal
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
type
  TRecordA = record helper for <ordinal> | record | array type;
  ...
  THelperRecordA = record helper for TRecordA
  ...
  end; 
  
  TRecordB = type TRecordA;

  THelperRecordB = record helper for TRecordB
    ...
     function Some(): TOtherType;
  end; 

var
   A: TRecordA;
....
  AA := THelperRecordB(A).Some();



или нужно чтобы было красиво?
...
Рейтинг: 0 / 0
Generics, как объявлять класс-потомок от заданного T?
    #39987235
Kazantsev Alexey
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Kazantsev Alexey
rgreat
Создай тикет в ембаркадере.

А уже есть, вроде. Надо будет поискать.

Нашёл, можно голосовать: https://quality.embarcadero.com/browse/RSP-13340
...
Рейтинг: 0 / 0
Generics, как объявлять класс-потомок от заданного T?
    #39987258
rgreat
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Kazantsev Alexey,

Оказывается - уже.
...
Рейтинг: 0 / 0
Generics, как объявлять класс-потомок от заданного T?
    #39987267
Фотография X-Cite
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
white_nigger
Kazantsev Alexey
Речь не о наследовании. Один хелпер в одном модуле, другой в другом. Подключаем оба модуля...
Странный класс, к которому вынуждены лепить кучу хелперов...


Если хелперы рассматривать как методы расширений, то самое то...

Есть какой нибудь TStream а к нему 150 фреймворков могут добавлять свои расширения, какие подключил, такие и получил возможности...
...
Рейтинг: 0 / 0
Generics, как объявлять класс-потомок от заданного T?
    #39987307
white_nigger
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
X-Cite
Есть какой нибудь TStream а к нему 150 фреймворков могут добавлять свои расширения, какие подключил, такие и получил возможности...
Хелпер - это костыль к базовому классу, когда его архитектура не позволяет ни по человечески реализовать функционал, ни нормально унаследоваться. Чем больше нужно костылей, тем кривее изначальная архитектура класса. С записями и простыми типами - более оправдано. Хотя я сам и для классов использую хелперы, но в основном чтобы достучаться до протектед методов без класс-аксессоров при разбиении на модули. Просто мы стараемся по возможности минимизировать список паблик методов в наших продуктах, а то такие фантазеры попадаются... И пока лично у меня не было нужды иметь более одного хелпера к классу
...
Рейтинг: 0 / 0
Generics, как объявлять класс-потомок от заданного T?
    #39987428
Фотография X-Cite
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
white_nigger,

Я в аналогию привожу IServiceCollection в .Net Core
Ставишь какой-нибудь фреймворк а-ля Swagger
Добавляется .AddSwagger()
В котором уже инкапсулирован код регистрации в IServiceCollection...

В Delphi отличный пример для TFiled

Например лежит в базе какой-нибудь Блоб... Но ты знаешь четкую его структуру...
И вместо того чтобы писать AsStream и еще код по преобразованию в собственную модель, можно реализовать расширение(хелпер)
AsMyModel
И таких добавлений может быть сколько угодно много...
Например подключил работу с JPEG - появился AsJpeg
Подключил работу с RAW - появился AsRaw

Это же удобно..
...
Рейтинг: 0 / 0
Generics, как объявлять класс-потомок от заданного T?
    #39987701
white_nigger
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
X-Cite
Это же удобно
Да ради бога. Я тоже использую когда нужно. Просто не было нужды в использовании сразу нескольких.
...
Рейтинг: 0 / 0
17 сообщений из 42, страница 2 из 2
Форумы / Delphi [игнор отключен] [закрыт для гостей] / Generics, как объявлять класс-потомок от заданного T?
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]