Узнать чем специализирован предок при наследовании генериков

Вопросы программирования на Free Pascal, использования компилятора и утилит.

Модератор: Модераторы

Узнать чем специализирован предок при наследовании генериков

Сообщение zub » 04.04.2017 14:16:11

Как узнать чем специализирован предок? объявлять тип поновой както некрасиво - сейчас компилятор считает типы одинаковыми, а вдруг завтра перестанет?
Код: Выделить всё
program test;
uses
  gvector;
type

TMyKeyType=String;
TMyValueType=Integer;

generic GPair<TKey,TValue>=record
  Key:TKey;
  Value:TValue;
end;

generic GMyArray<TKey,TValue> = class(specialize TVector<specialize GPair<TKey,TValue>>)
//type
   //TPair=specialize GPair<TKey,TValue>;

   procedure Insert(const Key:TKey;const Value:TValue);inline;
   function GetValue(key:TKey):TValue;inline;
   property Items[i : TKey]: TValue read GetValue write Insert; default;
end;

TMyArray=specialize GMyArray<TMyKeyType,TMyValueType>;

procedure GMyArray.Insert(const Key:TKey;const Value:TValue);
var
   //Pair:TPair;
   Pair:Как узнать чем был специализирован предок?
begin
  Pair.Key:=Key;
  Pair.Value:=Value;
  PushBack(Pair);
end;
function GMyArray.GetValue(key:TKey):TValue;
var
   i:SizeUInt;
begin
  for i:=0 to Size-1 do
    if Mutable[i]^.Key=key then
      exit(Mutable[i]^.Value)
end;
begin
end.

Если раскоментить повторное объявление - все работает, но хотелось бы без него
zub
долгожитель
 
Сообщения: 2073
Зарегистрирован: 14.11.2005 23:51:26

Re: Узнать чем специализирован предок при наследовании генер

Сообщение Дож » 04.04.2017 15:23:42

Наверное, никак? :) Что из себя семантически представляет "чем был специализирован предок"? Предок -- это просто какой-то класс.

ИМХО, сам дженерик TVector внутри себя должен озаботиться и объявить тип TItem, чтобы в клиентском коде можно было использовать TSuccessor.TItem, но этого, увы, нет...
Аватара пользователя
Дож
энтузиаст
 
Сообщения: 661
Зарегистрирован: 12.10.2008 16:14:47

Re: Узнать чем специализирован предок при наследовании генер

Сообщение zub » 04.04.2017 15:34:46

да, чето я туплю. с учетом того что специализируемых аргументов может быть много - придумать чтото внятное сложно.
zub
долгожитель
 
Сообщения: 2073
Зарегистрирован: 14.11.2005 23:51:26

Re: Узнать чем специализирован предок при наследовании генер

Сообщение AlexVinS » 05.05.2017 07:30:53

Не меняя класс TVector не получится, то чем специализирован дженерик - это private type, но можно объявить новый тип.
Код: Выделить всё
  generic TVector<T> = class
  public
  type Foo = T;
//...
  end
Аватара пользователя
AlexVinS
новенький
 
Сообщения: 95
Зарегистрирован: 27.01.2009 01:18:01

Re: Узнать чем специализирован предок при наследовании генер

Сообщение Дож » 05.05.2017 13:57:11

AlexVinS, отличная идея!
Аватара пользователя
Дож
энтузиаст
 
Сообщения: 661
Зарегистрирован: 12.10.2008 16:14:47


Вернуться в Free Pascal Compiler

Кто сейчас на конференции

Сейчас этот форум просматривают: нет зарегистрированных пользователей и гости: 2

Рейтинг@Mail.ru