考慮代理模式的下列情況。 (不知道這確實是一個「代理模式」,但我會去用它)。如何從通用代理設計專門的代理類。
我給出一個類犬和代理類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 *)
違反原則GermanShepardProxy
是DogProxy
。 我可以使用受保護的繼承,但GermanShepardProxy
不再是Dog
了,因此相當無用。
總結:上面給出Dog
,DogProxy
和GermanShepard
,我怎麼能有效地設計一個GermanShepardProxy
,這應該是一個Dog
但不是DogProxy
?
我說'GermanShepardProxy'應該是'Dog',否則顯然不一致。不幸的是,我不能重構類的層次結構,我正在尋找一種設計'GermanShepardProxy'的一致方法。 –
那麼,C++是C++。就是這樣。如果你必須完全擁有這個層次結構,那麼你可以隱藏超類中的setSource(),或者使其成爲虛方法,並且在GermanShepardProxy :: setSource()中使用dynamic_cast <>,如果對象不是德國人謝潑德。我看不到其他選擇。 –
我認爲可能有一些聰明的做法不僅僅包含子類。我現在試圖沿着來自'Dog'的子類化路線推理,並且添加一個'DogProxy'成員來用作私有實現......讓我們來看看我是否有意義。 –