1

こんにちは私はいくつかの型キャストアプローチに関して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アプローチでは間違った方向に進んでいる可能性があるということです。

何を指示してるんですか?どうすればいいですか?

どうもありがとうございます!

4

1 に答える 1

5

Delphiコードは古く、ジェネリック、C++テンプレートのDelphiアナログよりも前のものです。最新のDelphiコードでは、これらのリストクラスは単に存在しません。代わりに、とを使用TList<TBaseItem>TList<TChildItem>ます。

C ++コードでは、単にandを使用vector<TBaseItem*>vector<TChildItem*>ます。C ++の翻訳には、実装する意味がありませTBaseClassTChildClass

用語も訂正します。Delphiのプロパティは上書きできません。の新しいプロパティTChildClassはまさにそれ、新しいプロパティです。

于 2013-03-20T22:36:41.050 に答える