2

プロキシ パターン Class がAあり、そのプロキシは ClassPrxAです。質問1

virtualのようにいくつかの関数を定義した場合、それらは偶数のAように定義されるはずですか?virtualPrxA

今なら

Class B : public A
{
///code
}

プロキシ クラスも継承する必要があると思います。

Class PrxB : public PrxA {
/// code
}

これらのプロキシクラスには次のルールがあると仮定します

  1. c'tor で元のクラスをインスタンス化する
  2. 異なる内部クラス間で渡される参照/ポインタ パラメータに対して内部的に渡されます。
  3. プロキシ クラスの実際の impl を取得するには (つまり、 from から取得Aするには、 fromとfromPrxAを提供する impl ストアを用意します。APrxABPrxB

Cこれで、PrxA を c'tor の参照として受け取るクラスができました。

`C::C(PrxA& A): pa(A),a(getImpl(PrxA))

初期化中のクラス C のローカル メンバー。

PrxA& pa;
A& a;

A を渡すとうまくいきます。ここでは問題ありません。

質問 2Bこのクラスに渡すとき、の impl (C の c'tor で初期化された 2 番目)を取得Cする最良の方法は何ですか?BBA

このようなものにキャストすることを考えることができますがgetImpl(A)、良いソルンのようには見えません.

A* getAImpl(PrxA& pa)
{
  if (implA(pa) != NULL)
    return A;
  else
    return dynamic_cast<B>(A); // can't do this. since A will be returned but I actually need B
}

PrxA を参照として取っているPrxBようなクラスに渡す必要がある場合、ここでどのようなアプローチを取る必要がありますか? Cキャスティング以外のアプローチはありますか?

ここでまた興味深いのは、コンストラクターを 1 つに制限すると、イニシャライザーで impl を取得するためにそれに応じて処理する必要がある PrxA または PrxB の参照を取得できることです。私は良いアプローチを知る必要があります。

4

1 に答える 1

0

Aでいくつかの関数を仮想として定義した場合、それらはPrxAでも仮想として定義されることになっていますか?

PrxAを多形基本クラスとして扱うことができる一方で、PrxAから派生することを意図している場合のみ。(あなたの投稿の残りの部分から、これが事実であるように見えます。)

`C :: C(PrxA&A):pa(A)、a(getImpl(A))Aを渡すと、うまく機能します。ここでは問題ありません。BをこのクラスCに渡すとき、Bのimplを取得するための最良の方法は何ですか(Cのc'torで2番目に初期化されますか?(BはAから派生していることに注意してください)

ここで混乱が生じます。AがPrxAから派生していない限り、ここでAを渡すことはできません。言い回しをもう少し正確にするか、コードを使用して説明する必要があります。

PrxB(ここでもBではなく)を渡し、PrxBがPrxA(これを示しています)から派生している場合、PrxBはPrxA(リスコフの置換原則を適用)と同じインターフェイスを実装する必要があるため、PrxBから正確にA&を取得できるはずです。同じ。これには、BがAから派生していると仮定して、A&からBへのインスタンスを取得する必要がある場合が含まれます。

PrxAを参照しているCのようなクラスにPrxBを渡す必要がある場合、ここでどのようなアプローチを取る必要がありますか?

PrxBがPrxAから派生していることを示したように、PrxBのインスタンスへの参照となる可能性のあるPrxA&を使用しているため、これはすでに正常に機能しているはずです。

于 2011-08-22T07:50:48.230 に答える