こんにちは私はいくつかの型キャストアプローチに関して1つの質問があります。いくつかのDelphiファイルをC++に翻訳しています。TListから派生したクラスのdelphi宣言があり、他の派生クラスの基本クラスです。
type TBaseItem = class (TObject)
public
procedure SomeProcedure; virtual; abstract;
end;
Type TBaseClass = class(TList)
private
function GetItem(Index: Integer): TBaseItem;
procedure SetItem(Value: TBaseItem; Index: Integer);
public
property Items[Index: Integer]: TBaseItem read GetItem write SetItem;
end;
function TBaseClass.GetItem(Index: Integer): TBaseItem;
begin
Result := TBaseItem(inherited Items[Index]);
end;
procedure TBaseClass.SetItem(Value: TBaseItem; Index: Integer);
begin
inherited Items[Index] := Value;
end;
これは、2つの基本クラスTBaseItemとTBaseClassです。したがって、ここでは、TBaseItemから派生した新しいクラスTchildItemとTBaseClassから派生したTChildClassが宣言されています。TChildItemはメソッドSomeMethodをオーバーライドします。さらに重要なのは、TChildtClassがプロパティItemsをオーバーライドして、TBaseItemの代わりにTParentItemアイテムを返すようにすることです。
type TChildItem = class (TBaseItem)
public
procedure SomeProcedure; override;
end;
type TChildClass = class(TBaseClass)
private
function GetItem(Index: Integer): TChildItem;
procedure SetItem(Value: TChildItem; Index: Integer);
public
property Items[Index: Integer]: TChildItemread GetItem write SetItem;
end;
function TChildClass .GetItem(Index: Integer): TChildItem;
begin
Result := TChildItem(inherited Items[Index]);
end;
procedure TChildClass.SetItem(Value: TChildItem; Index: Integer);
begin
inherited Items[Index] := Value;
end;
この例では、クラスの派生とプロパティのオーバーライドがいかに簡単にできるかを示したいと思いました。リストから適切なタイプのアイテムを取得するには、親(ベース)プロパティItemを呼び出し、適切なタイプに型キャストするだけです。これはデルフィのアプローチです。
コードのこの部分をC++に変換するにはどうすればよいでしょうか。現在、どのクラスからも派生していない新しい基本クラスを宣言しました。これには、パブリック変数Itemsがあります。
class TBaseItem{
virtual void SomeMethod();
}
class TBaseClass {
public:
vector<TBaseItem> Items;
};
class TChildItem : public TBaseItem{
}
class TChildClass : public TBaseClass {
};
その後、
return (TChildItem) Items[Idx]
つまり、そのベクトルItemsなどの親(TBaseClass)のパブリック変数にアクセスし、適切な型に型キャストしたいということです...私の第一印象は、そのDelphiアプローチでは間違った方向に進んでいる可能性があるということです。
何を指示してるんですか?どうすればいいですか?
どうもありがとうございます!