2016-02-08 32 views
2

我想创建一个类或接口,我可以继承,总是利用当前的类实例作为方法的参数...创建泛型类或接口与儿童类自我类型参数

下面是一个例子,解释我的问题:

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是对子级的出发点,参照基本的算术运算和子类可以被声明为

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; 

参数类型为aoTInteger而不是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; 

,但我无法找出正确的语法...

没有人有这种可能性的任何想法(或不可)?

回答

3

如果我正确地展开它,你可能想从一个通用接口派生你的类。

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; 

根据Stefan Glienke's comment编辑的答案:现在该类的方法接受声明为对象或接口的参数。

var 
    ao: IArithmeticObject<TInteger>; 
begin 
    ao := TInteger.Create; 
    ao.multiply(ao); 
end. 
+0

尽管有效,但它没有什么意义,因为那样你就在API中混合了接口和对象引用。你想使用'IArithmeticObject ',但只能将'TInteger'传递给它的方法。因此,如果将“IArithmeticObject ”的方法的参数从“T”更改为“IArithmeticObject ”,那么它会更有意义。 –