2017-08-11 17 views
1

データを保持するTMyBaseClass、インスタンスのリストを保持するTMyBaseClassList、データセットをスクロールしてTMyBaseClassListオブジェクトを埋め込むTMyBaseClassReaderのインスタンスのリストを保持する3つの基本クラスを定義します。これは私のコードです:ジェネリックリスト型のパラメータをコンストラクタ制約で定義する方法は?

TMyBaseClass = class 
    public 
    // properties 
    constructor Create; 
    end; 

    TMyBaseClassList<T: TMyBaseClass, constructor> = class(TObjectList<TMyBaseClass>) 
    public 
    function AddNew: T; 
    end; 

    TMyBaseClassReader<T: TMyBaseClass> = class 
    public 
    class procedure ReadProperties(const DataSet: TCustomADODataSet; 
     const Item: T); virtual; abstract; 
    class procedure ReadDataSet(const DataSet: TCustomADODataSet; 
     const List: TMyBaseClassList<T>);// <- E2513 
    end; 

... 

constructor TMyBaseClass.Create; 
begin 
    inherited; 
end; 

function TMyBaseClassList<T>.AddNew: T; 
begin 
    Result := T.Create; 
    Add(Result); 
end; 

class procedure TMyBaseClassReader<T>.ReadDataSet; 
var 
    NewItem: T; 
begin 
    while not DataSet.Eof do 
    begin 
    NewItem := List.AddNew; 
    ReadProperties(DataSet, NewItem); 
    DataSet.Next; 
    end; 
end; 

は、それから私は、子クラスを派生し、唯一ReadPropertiesメソッドを実装します。しかし、私はE2513エラーを取得しています:

E2513 Type parameter 'T' must have one public parameterless constructor named Create

問題とどのように私はそれを修正することができますは何ですか?

+0

なぜclass abstractを使用しましたか?あなたは何を達成したと思いますか? –

+0

@DavidHeffernanあなたは 'ReadProperties'を意味しますか?私は 'TMyBaseClassReader 'でそれをオーバーライドしたいです、そして、私はすべてのサブクラスで 'ReadDataSet'のロジックを複製しません。 – saastn

+0

いいえ、私が書いたことを意味します。 –

答えて

4

コンパイラがTが要件を満たしているかどうかを確認できないというエラーです。そのように派生クラスを宣言してください

TMyBaseClassReader<T: TMyBaseClass, constructor> 
関連する問題