2011-08-22 22 views
2

如果我有一個代理模式類A,並且代理類是PrxA。 問題1C++代理模式中的虛函數

如果我定義一些功能,如Avirtual是那些應該被定義爲virtual即使在PrxA

現在,如果

Class B : public A 
{ 
///code 
} 

我相信代理類也應該繼承。

Class PrxB : public PrxA { 
/// code 
} 

現在假設這些代理類有以下規則

  1. 實例化的原班在c'tor
  2. 將圍繞內部傳遞任何引用/的指針param傳遞跨越不同的內部類
  3. 要獲得代理類的實際impl(即從PrxA得到A,我們有一個impl商店,它將給我們APrxABPrxB

現在有一個C類,其中以PrxA作爲參考的c'tor。

`C :: C(PRXA & A):PA(A)中,(getImpl(PRXA)),這些被初始化的C類的

本地成員。

PrxA& pa; 
A& a; 

如果我通過A它會工作得很好。這裏沒問題。

問題2 當我通過B這一類C什麼是獲得B的IMPL(第二次在C'S c'tor初始化的最好方法是什麼?(請注意BA派生)

我能想到的鑄造在getImpl(A)這樣的事情,但看起來並不像一個很好的SOLN。

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 
} 

什麼辦法,我應該在這裏拍攝,如果我需要通過PrxB到類,如C是以PrxA爲參考?有沒有辦法比鑄造。

此外,如果我們限制在一個構造這裏有趣的事情,我們可以得到PRXA或PrxB的引用這需要進行相應的處理,以獲得在初始化的IMPL。我需要知道一個好方法。

+1

爲什麼你在帖子末尾添加了15個空行?你爲什麼不使用預覽功能? –

+0

格式問題。我糾正了它。對於那個很抱歉。 – leonidus

+0

我認爲(如果我正確解釋)你在這裏有一個非常有趣的問題,但很難解釋。也許你可以重新組織一下? – Owen

回答

0

如果我在A中定義了一些虛擬函數,那些應該被定義爲虛擬的函數,即使在PrxA中?

只有當您打算從PrxA派生出來,同時能夠將PrxA視爲多態基類時。 (從您的其他帖子看,情況就是這樣。)

`C :: C(PRXA & A):PA(A),A(getImpl(A)) 如果我通過將它的工作很大。這裏沒問題。 當我通過B到這個C類什麼是獲得B的IMPL最好的辦法(第二次在C'S c'tor初始化?(注B從A派生)

這是事情變得撲朔迷離..你不能在這裏通過A,除非A來源於PrxA ..你需要在你的措辭中更精確一些,或者使用代碼來解釋。

如果你通過PrxB(再次,不是B)和PrxB派生從PrxA(你已經顯示)開始,那麼因爲PrxB應該實現與PrxA相同的接口(應用Liskov替換原則),你應該能夠從PrxB得到一個完全相同的A &,包括你需要得到一個A &到B的實例,假設B派生自A.

如果我需要將PrxB傳遞給像C這樣以PrxA爲參考的類,我應該採取什麼方法?

正如你已經證明,從PrxB派生PRXA那麼這應該正常工作已經因爲你正在做一項PRXA &可以是PrxB的實例沒有問題的參考。