在子 classes 中创建通用 class 或带有自类型参数的接口
Create generic class or interface with self typed parameters in children classes
我想创建一个 class 或我可以子class 的接口,始终使用当前 class 实例作为方法参数...
这里有一个例子来解释我的问题:
type IArithmeticObject = interface(IInterface)
procedure assign(ao : IArithmeticObject);
procedure add(ao : IArithmeticObject);
procedure remove(ao : IArithmeticObject);
procedure multiply(ao : IArithmeticObject);
procedure divide(ao : IArithmeticObject);
end;
接口 IArithmeticObject
将作为起点,引用基本算术运算和子 classes 可以声明为
type TInteger = class(TInterfacedObject, IArithmeticObject)
procedure assign(ao : TInteger);
procedure add(ao : TInteger);
procedure remove(ao : TInteger);
procedure multiply(ao : TInteger);
procedure divide(ao : TInteger);
end;
ao
的参数类型是 TInteger
而不是 IArithmeticObject
。
另一个想法是使用自引用泛型类型,例如:
AMathObject = class;
AMathObject<T : AMathObject, constructor> = class
procedure assign(ao : T);virtual;abstract;
procedure add(ao : T);virtual;abstract;
procedure remove(ao : T);virtual;abstract;
procedure multiply(ao : T);overload;virtual;abstract;
procedure divide(ao : T);virtual;abstract;
end;
但我想不出正确的语法...
有没有人对这种可能性(或不可能)有任何想法?
如果我理解正确,您可能希望从通用接口派生 class。
type
IArithmeticObject<T> = interface
procedure assign(ao: IArithmeticObject<T>);
procedure add(ao: IArithmeticObject<T>);
procedure remove(ao: IArithmeticObject<T>);
procedure multiply(ao: IArithmeticObject<T>);
procedure divide(ao: IArithmeticObject<T>);
end;
TInteger = class (TInterfacedObject, IArithmeticObject<TInteger>)
procedure assign(ao: IArithmeticObject<TInteger>);
procedure add(ao: IArithmeticObject<TInteger>);
procedure remove(ao: IArithmeticObject<TInteger>);
procedure multiply(ao: IArithmeticObject<TInteger>);
procedure divide(ao: IArithmeticObject<TInteger>);
end;
根据 编辑的答案:现在 class 的方法接受声明为对象或接口的参数。
var
ao: IArithmeticObject<TInteger>;
begin
ao := TInteger.Create;
ao.multiply(ao);
end.
我想创建一个 class 或我可以子class 的接口,始终使用当前 class 实例作为方法参数...
这里有一个例子来解释我的问题:
type IArithmeticObject = interface(IInterface)
procedure assign(ao : IArithmeticObject);
procedure add(ao : IArithmeticObject);
procedure remove(ao : IArithmeticObject);
procedure multiply(ao : IArithmeticObject);
procedure divide(ao : IArithmeticObject);
end;
接口 IArithmeticObject
将作为起点,引用基本算术运算和子 classes 可以声明为
type TInteger = class(TInterfacedObject, IArithmeticObject)
procedure assign(ao : TInteger);
procedure add(ao : TInteger);
procedure remove(ao : TInteger);
procedure multiply(ao : TInteger);
procedure divide(ao : TInteger);
end;
ao
的参数类型是 TInteger
而不是 IArithmeticObject
。
另一个想法是使用自引用泛型类型,例如:
AMathObject = class;
AMathObject<T : AMathObject, constructor> = class
procedure assign(ao : T);virtual;abstract;
procedure add(ao : T);virtual;abstract;
procedure remove(ao : T);virtual;abstract;
procedure multiply(ao : T);overload;virtual;abstract;
procedure divide(ao : T);virtual;abstract;
end;
但我想不出正确的语法...
有没有人对这种可能性(或不可能)有任何想法?
如果我理解正确,您可能希望从通用接口派生 class。
type
IArithmeticObject<T> = interface
procedure assign(ao: IArithmeticObject<T>);
procedure add(ao: IArithmeticObject<T>);
procedure remove(ao: IArithmeticObject<T>);
procedure multiply(ao: IArithmeticObject<T>);
procedure divide(ao: IArithmeticObject<T>);
end;
TInteger = class (TInterfacedObject, IArithmeticObject<TInteger>)
procedure assign(ao: IArithmeticObject<TInteger>);
procedure add(ao: IArithmeticObject<TInteger>);
procedure remove(ao: IArithmeticObject<TInteger>);
procedure multiply(ao: IArithmeticObject<TInteger>);
procedure divide(ao: IArithmeticObject<TInteger>);
end;
根据
var
ao: IArithmeticObject<TInteger>;
begin
ao := TInteger.Create;
ao.multiply(ao);
end.