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

Кто хорошо разбирается в дженериках?


Хотеть сделать такое:
Код: pascal
1.
type TMyType<T> = class(T)

А оно мне такое:
[dcc32 Error] E2021 Class type requiredАга, думаю, ну да, я ж ему не указал что под "T" могут быть только классы... Как оно там пишется...
Код: pascal
1.
type TMyType<T: class> = class(T)

Теперь под "T" может быть задан только класс. Но оно мне всё равно такое же:
[dcc32 Error] E2021 Class type requiredТак, думаю, какой там ещё вариант был, вроде конкретный класс указать (типа под "T" могут быть только его потомки)?
Код: pascal
1.
type TMyType<T: TObject> = class(T)

А вообще хрен:
[dcc32 Error] E2510 Type 'TObject' is not a valid constraintНельзя самый базовый? Ачёйта? Странно... Ну ок, скопируем для начала как в примере из доков:
Код: pascal
1.
type TMyType<T: TComponent> = class(T)

Вот уже с TComponent пускает, но в правой части возвратилося:
[dcc32 Error] E2021 Class type required

Ну и что за чушь? Я же явно прописал, что "T" это будет класс. Что же ему не так? Как-то можно обойти?

Спасибо!
...
Рейтинг: 0 / 0
Generics, как объявлять класс-потомок от заданного T?
    #39986554
Нужно что бы класс поддерживал дженерики типа TList и тогда ты сможешь написать

Код: pascal
1.
2.
3.
4.
5.
6.
    , Generics.Collections;

type

  TMyType<T> = class(TList<T>)
  end;




Код: pascal
1.
  TList<T> = class(TEnumerable<T>)
...
Рейтинг: 0 / 0
Generics, как объявлять класс-потомок от заданного T?
    #39986580
Cobalt747
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
а вопрос-то в чём?
переформулируй что ты хочешь получить
...
Рейтинг: 0 / 0
Generics, как объявлять класс-потомок от заданного T?
    #39986582
Cobalt747,

java насмотрелся где есть extends \ super
...
Рейтинг: 0 / 0
Generics, как объявлять класс-потомок от заданного T?
    #39986585
Почему то всё заработало, решил попробовать Чё это оно не работает

Код: pascal
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
  TTest<T: TForm1> = class(TObjectDictionary<string, T>)
    procedure Test;
  end;

var
  Form1: TForm1;

implementation

{$R *.dfm}

procedure TTest<T>.Test;
begin

end;
...
Рейтинг: 0 / 0
Generics, как объявлять класс-потомок от заданного T?
    #39986604
Uridian
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Код: pascal
1.
2.
3.
  TTest<T: TForm1> = class(TObjectDictionary<string, T>)

  procedure TTest<T>.Test;


Здесь "TTest<T>.Test" какое Т имеется в виду, это: "<T: TForm1>" или это "<string, T>"?
...
Рейтинг: 0 / 0
Generics, как объявлять класс-потомок от заданного T?
    #39986609
Uridian,

Второго. То есть если упростить

Код: pascal
1.
TTest<T: TObject> = class(TObjectDictionary<string, T>)



То мы задаём, что можно создать генерик только из классов, в которых входит предок TObject
...
Рейтинг: 0 / 0
Generics, как объявлять класс-потомок от заданного T?
    #39986642
Фотография _Vasilisk_
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Cobalt747
переформулируй что ты хочешь получить
Он хочет отнаследоваться от Generic типа

ResourceSpace,

Код: pascal
1.
TMyHelper = class helper for TObject

не спасет ОРД?
...
Рейтинг: 0 / 0
Generics, как объявлять класс-потомок от заданного T?
    #39986692
ResourceSpace
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
ВсеРазумный, спасибо за ответы!
Код: pascal
1.
TTest<T: TForm1> = class(TObjectDictionary<string, T>)

Так пропускает, да, но тогда оно не является потомком TForm1.
Код: pascal
1.
TTest<T: TObject> = class(TObjectDictionary<string, T>)

Я понимаю что вы просто для примера отредактировали предыдущий код, но как я уже писал в первом посте, именно такое уже чё-то не компилится. :)
[dcc32 Error] E2510 Type 'TObject' is not a valid constraint
_Vasilisk_, хелперы я знаю, но увы не подходят. Во-первых хелпер же у класса может быть только один. А во-вторых мне-таки нужны поля (в том числе типа "T").


Мне нужно чтоб получился именно потомок от "T", чтоб всякие "is" и "as" это подтверждали.

Технически он ругается только на то что "T" по его мнению всё ещё может оказаться не классом.
Как бы ему втолковать-то, что "всё ok, это точно класс"?
...
Рейтинг: 0 / 0
Generics, как объявлять класс-потомок от заданного T?
    #39986743
Фотография X-Cite
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
ResourceSpace,

Никак...
Нельзя наследоваться от неизвестно чего.

Когда мы говорим о
Код: pascal
1.
2.
3.
type
  TMyType<T> = class
  end;



Предполагается, что Т - это какой то неизвестный тип, который используется внутри класса.

Код: pascal
1.
2.
3.
4.
5.
TMyType<T> = class
private
  FOne: T;
  FTwo: TList<T>;
end;



То что вы хотите, даже не понятно как представить...

Какова ваша цель?
...
Рейтинг: 0 / 0
Generics, как объявлять класс-потомок от заданного T?
    #39986770
Фотография _Vasilisk_
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
ResourceSpace
хелпер же у класса может быть только один.
хелперы можно наследовать друг от друга
ResourceSpace
А во-вторых мне-таки нужны поля
Использовать какой-нибудь Tag для объекта-контейнера
...
Рейтинг: 0 / 0
Generics, как объявлять класс-потомок от заданного T?
    #39986799
alekcvp
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
X-Cite

Предполагается, что Т - это какой то неизвестный тип, который используется внутри класса.

Код: pascal
1.
2.
3.
4.
5.
TMyType<T> = class
private
  FOne: T;
  FTwo: TList<T>;
end;



Какова ваша цель?


Предполагаю что он хочет расширить возможности TMyType<T> через наследование, но при этом ограничить T только классами.
...
Рейтинг: 0 / 0
Generics, как объявлять класс-потомок от заданного T?
    #39986805
Фотография X-Cite
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
alekcvp,

Код: pascal
1.
2.
3.
4.
5.
6.
7.
8.
TMyType<T: class> = class
end;

TNewType<T: class> = class(TMyType<T>)
end;

TOtherType<T: class> = class(TNewType<T>)
end;


Это?
...
Рейтинг: 0 / 0
Generics, как объявлять класс-потомок от заданного T?
    #39986825
ResourceSpace
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
X-Cite
Нельзя наследоваться от неизвестно чего.
X-Cite
Предполагается, что Т - это какой то неизвестный тип, который используется внутри класса.
alekcvp
... , но при этом ограничить T только классами.

Перечитываю документацию, и там есть такой раздел как "Generics Constraints".
Так что я уже ограничил "T" только классами - так что хотя это всё ещё и "неизвестно чего", но уже "точно класс".
Только вот конструкция "class(T)" почему-то осталась просто не в курсе ограничения "<T: class>".

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

В справке
http://docwiki.embarcadero.com/RADStudio/Sydney/en/Class_and_Record_Helpers_(Delphi)

авторThe syntax for declaring a class helper is:
type
identifierName = class|record helper [(ancestor list)] for TypeIdentifierName
memberList
end;

The ancestor list is optional. It can be specified only for class helper.


Код: pascal
1.
2.
3.
4.
5.
  TMyHelper = class helper for TObject
  end;

  TNewHelper = class helper(TMyHelper) for TObject
  end;
...
Рейтинг: 0 / 0
Generics, как объявлять класс-потомок от заданного T?
    #39986870
alekcvp
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
X-Cite
alekcvp,
Код: pascal
1.
2.
TNewType<T: class> = class(TMyType<T>)
end;


Это?

Думаю это.
...
Рейтинг: 0 / 0
Generics, как объявлять класс-потомок от заданного T?
    #39986872
alekcvp
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Упс.
...
Рейтинг: 0 / 0
Generics, как объявлять класс-потомок от заданного T?
    #39986881
ResourceSpace
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
о... Так вот что/зачем такое "ancestor list"...)))))
Описание конечно супер: "Не является обязательным. Может указываться только для хелперов."
Класс!) Вроде работает)))
...
Рейтинг: 0 / 0
Generics, как объявлять класс-потомок от заданного T?
    #39986883
ResourceSpace
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Правда возникает вопрос: а как узнать имя ancestor'а если это не наш же, а какой-нибудь чужой (например системный) хэлпер - они как предлагают узнавать его имя..?

alekcvp
Думаю это.
Не-а. Наследник самого "T" нада, а не наследник списка/словаря из "T" или подобного.
...
Рейтинг: 0 / 0
Generics, как объявлять класс-потомок от заданного T?
    #39986887
ResourceSpace
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Поспешил... Работает, но тока для "class", а вот для "record":
Код: pascal
1.
2.
3.
4.
5.
  TMyHelper = record helper for String // или Int64Rec
  end;

  TNewHelper = record helper(TMyHelper) for String // или Int64Rec
  end;

Чё-то уже хрен вам:
[dcc32 Error] E2029 ',' or ':' expected but '(' found
[dcc32 Error] E2029 ';' expected but 'FOR' found
[dcc32 Error] E2029 ',' or ':' expected but 'END' foundУ этого Эмберберо всё блин не слава богу... :D
...
Рейтинг: 0 / 0
Generics, как объявлять класс-потомок от заданного T?
    #39987040
Фотография _Vasilisk_
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
ResourceSpace
Правда возникает вопрос: а как узнать имя ancestor'а если это не наш же, а какой-нибудь чужой (например системный) хэлпер - они как предлагают узнавать его имя..?
Смотреть исходники
ResourceSpace
Поспешил... Работает, но тока для "class", а вот для "record":
http://docwiki.embarcadero.com/RADStudio/Sydney/en/Class_and_Record_Helpers_(Delphi) The ancestor list is optional. It can be specified only for class helper.
...
Рейтинг: 0 / 0
Generics, как объявлять класс-потомок от заданного T?
    #39987123
alekcvp
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
ResourceSpace
alekcvp
Думаю это.
Не-а. Наследник самого "T" нада, а не наследник списка/словаря из "T" или подобного.

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

Можно радикально - сменить компилятор. Free Pascal так умеет.
...
Рейтинг: 0 / 0
Generics, как объявлять класс-потомок от заданного T?
    #39987171
kapas
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
ВсеРазумный,

Код: pascal
1.
2.
3.
4.
 
  TTest<T: TForm1> = class(TObjectDictionary<string, T>)
     procedure Test;
  end;



Здесь TTest - наследник TObjectDictionary, а в случае
Код: pascal
1.
 TMyType<T: TObject> = class(T)


некоторого, непонятно какого класса (тип которого еще требуется инстанцировать). И ошибка компиляции закономерна.

И это, по большому счету, сделано в Delphi разумно и правильно (в отличие от того что допустимо в FreePascal, см.:

Kazantsev Alexey
ResourceSpace
Как-то можно обойти?

Можно радикально - сменить компилятор. Free Pascal так умеет.
)

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

Хелперы в дельфях это хелперы курильщика (как и дженерики). Хелперы здорового человека, опять же, во Free Pascal.
...
Рейтинг: 0 / 0
25 сообщений из 42, страница 1 из 2
Форумы / Delphi [игнор отключен] [закрыт для гостей] / Generics, как объявлять класс-потомок от заданного T?
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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