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
問題とどのように私はそれを修正することができますは何ですか?
なぜclass abstractを使用しましたか?あなたは何を達成したと思いますか? –
@DavidHeffernanあなたは 'ReadProperties'を意味しますか?私は 'TMyBaseClassReader'でそれをオーバーライドしたいです、そして、私はすべてのサブクラスで 'ReadDataSet'のロジックを複製しません。 –
saastn
いいえ、私が書いたことを意味します。 –