2016-10-28 31 views
0

我將下圖中顯示的示例與我正在處理的實際項目進行了類比。我正在用C++實現這個項目。在獲取界面時防止暴露於課堂

這個例子的主要點是我有一個FruitGarden其中我知道它總是包含一個AppleTree。在FruitGarden的函數StartHarvesting中,應該檢查AppleTree是否準備好收穫。爲此,我創建了一個接口類。

我現在使用接口的方式是通過在Vegitation中實現函數GetTreePointer並將其轉換爲IFoodTree(並檢查NULL)。我在這裏看到的問題是,我正在將我的整棵樹展示給外部世界(通過執行GetTreePointer),從而啓用其他公用功能的調用,這些功能不打算在Vegitation之外使用。

我的主要問題是:什麼是最好的方式來獲得接口IFoodTree這是指向AppleTree

UML diagram

+0

被編輯爲使其更具可讀性,但由於我無法更新UML,所以我已經離開了「Vegitation」(=> Vegetation)。 – MSalters

回答

0

也許你不應該提供VegitationGetTreePointer(),可在Garden被用來檢查是否正常收穫。

爲了得到蘋果,在Vegitation,bool canHarvest()有助於檢查是否是收穫蘋果的正確時機,並且vector<Apple> harvest()獲得成果。通過這樣做,它不會在牌照外面暴露Tree

另一種實現方法是將Vegitation作爲Garden的內部受保護類別。

0

這裏有很多選擇。最簡單的可能是virtual bool Vegetations::ReadyForHarvest() const { return false; }

另一個容易的是保持私人功能private。如果AppleTree::Foo僅用於從Vegetation調用,則Vegetation應該定義爲private: virtual void Foo() = 0;。很明顯,Vegetation不應該知道派生類,這是扭轉繼承的方向,太脆弱了。相反,派生類必須實現基類所要求的純虛函數。編譯器幫助你做到這一點。