2016-03-07 32 views
0

考慮代理模式的下列情況。 (不知道這確實是一個「代理模式」,但我會去用它)。如何從通用代理設計專門的代理類。

我給出一個類犬和代理類DogProxy,其修改/延伸Dog的功能,是一個Dog本身

class DogProxy : public Dog 

代理類有一個公共的方法

void DogProxy::setSource(Dog *) 

它被調用來將代理「插入」到特定的對象上的Dog對象。

DogProxy,並給出準備使用,而我也給另一個(非代理)的子類

class GermanShepard : public Dog. 

我需要實現哪些是專門用於在使用與和僅與新的代理類GermanShepard

這種GermanShepardProxy應該有

void GermanShepardProxy::setSource(GermanShepard *) 

的,而不是通用setSource(Dog *),雖然這不是一個約束,它只是在我看來是有道理的。

我想GermanShepardProxy按照DogProxy來實現,它已經包含了大部分的功能。

我可以公開地從DogProxy繼承,但這樣做我有一個矛盾,因爲隱藏DogProxy::setSource(Dog *) 違反原則GermanShepardProxyDogProxy。 我可以使用受保護的繼承,但GermanShepardProxy不再是Dog了,因此相當無用。

總結:上面給出DogDogProxyGermanShepard,我怎麼能有效地設計一個GermanShepardProxy,這應該是一個Dog但不是DogProxy

回答

0

我可以公開地從DogProxy繼承,但這樣做我有一個 不一致,因爲隱藏DogProxy ::的SetSource(狗*)違反 原則GermanShepardProxy是DogProxy。

如果像你說的,GermandShepardProxyDogProxy,然後GermanShepardProxy必須實現setSource(Dog *)。因爲這就是DogProxy

你所述的目標是相互衝突的。如果GermandShepardProxyDogProxy,則執行此方法。如果不是,那就不是。

聽起來像你需要重構你的類層次結構。Dog的直接子類可能不應該是您的DogProxy,而是其他具有這兩個代理的所有共同功能的其他東西。然後,DogProxy子類,並且實現了它的setSource()方法,GermandShepardProxy也是子類,並實現了它自己的setSource()方法。

+0

我說'GermanShepardProxy'應該是'Dog',否則顯然不一致。不幸的是,我不能重構類的層次結構,我正在尋找一種設計'GermanShepardProxy'的一致方法。 –

+0

那麼,C++是C++。就是這樣。如果你必須完全擁有這個層次結構,那麼你可以隱藏超類中的setSource(),或者使其成爲虛方法,並且在GermanShepardProxy :: setSource()中使用dynamic_cast <>,如果對象不是德國人謝潑德。我看不到其他選擇。 –

+0

我認爲可能有一些聰明的做法不僅僅包含子類。我現在試圖沿着來自'Dog'的子類化路線推理,並且添加一個'DogProxy'成員來用作私有實現......讓我們來看看我是否有意義。 –