Ну так реализуйте, напишите как. Вот на гитхаб это не правильно сразу сувать потому что возможно есть способ написать что то типа:
type
I1<T>=interface
function f1: T;
end;
I2 = interface
function f1: object;
end;
C1<T>=class(I1<T>, I2)
a: T;
public
function I1.f1: T := a;
function I2.f1: object := a;
end;
begin end.
То есть явно указать функцию какого интерфейса реализовываем. Если бы вы посмотрели на пример внимательно - увидите что я явно реализовал оба интерфейса, но компилироваться это не хочет, потому что Program1.pas(16) : Повторное объявление на строчке реализации второй f1.
Так даже вся программа откомпилируется, но это не симметрично => уродливо, кроме того - не работает если оба интерфейса - шаблоны. А как для I1.f1 так же сделать?
function I1.f1: T := a;
Program1.pas(14) : Количество шаблонных параметров типа I1<T> должно равняться 1
function I1<T>.f1: T := a;
Program1.pas(9) : Класс C1<T> не реализует метод f1:T интерфейса I1<T>
И правда, интересный вопрос. Ну, #1, допустим не должно работать потому что:
type
I1<T>=interface end;
C1<T1, T2>=class(I1<T1>, I1<T2>)
end;
begin end.
В таком случае надо явно указать к какому из этих 2 интерфейсов относится функция.
А вот последнее не понятно, @Admin можете дать чёткое определение работе &? Оно только для функций должно работать? У меня вроде получилось недавно запихнуть его перед спецификатором шаблона класса и оно ничего не сделало, это ошибка?
type
TBase = abstract class
public
procedure Print() := Write(ToString());
procedure Println() := Writeln(ToString());
end;
TDerived = class(TBase)
public
Value: integer;
function ToString(): string; override := $'TDerived: Value = {Value}';
end;
begin
var A := new TDerived();
A.Value := 1;
A.Println();
end.
Выводится:
TDerived: Value = 1
Но если заменю на:
function ToString() := $'TDerived: Value = {Value}';
type
TMy<T> = class(System.ICloneable)
public
Value: T;
constructor(value_: T);
begin
Value := value_;
end;
function Clone(): object := new TMy<T>(Value);
function CloneAs() := TMy<T>(Clone());
end;
begin
end.
Потому что в C языках override ставить необязательно, его используют чтоб компилятор подсказывал, вдруг чего не так. А в паскале если вы его не поставили - значит эта функция не является частью цепочки.
type t1<T> = class end;
procedure p1<T>(self:t1<T>;a:T); extensionmethod := exit;
begin
var a := new t1<byte>;
a.p1(5);//Generic-функция p1 не может быть вызвана с данным набором фактических параметров
end.
Но ведь 5 можно неявно преобразовать к byte, и если написать p1&<byte> - его таки преобразовывает. Это ошибка?