2010-11-03 111 views
0

我有一個函數,2個派生類使用,但第三個沒有,將它留在基類中是有意義的,即使其中一個派生類不使用它?派生類共享方法

我能想到的禁止第三類的唯一方法是基本上創建一個派生於基類的中間類,然後使用常用函數的2派生出第二類。

是否有可能阻止第三類使用函數,同時讓兩個應該使用它的函數使用它?

這是否似乎太過分了,我的意思是隻要我不「嘗試」從第三類調用函數,它不應該是一個問題,我只是有興趣,如果有一種方式以防止它們一起沒有很多麻煩。

回答

3

有沒有辦法直接做到這一點。基本上,當你繼承子類時,你說的是子類是基類的一個更具體的版本。

在這種情況下,您試圖說「子類是基類的更具體的版本,except for the fact that it shouldn't be able to touch XXX」。實際上,這違反了Liskov Substitution Principle

處理此問題的最佳方法是在您的層次結構中添加第二個基類,這是我相信您提到的解決方案。

基本上,讓你的層次:

base 
| \---- subclass without feature available 
| 
\--base+feature 
     \--subclass one with specific feature 
     \--subclass two with specific feature 
+0

是的,這就是我的想象,我只是希望它不會有這個,我只是認爲我用於每個派生類的命名現在工作,而我不是確定一個適當的「中級」類名似乎是相當正確的......也不確定是否會導致大量的開銷...... – onaclov2000 2010-11-03 16:23:27

+0

@ onaclov2000:它應該不會引入任何開銷。我強烈建議嘗試使用慣例來強制執行此操作(即:命名),因爲您可能會遇到問題。它的驚人之處在於,忘記約定是多麼容易。 – 2010-11-03 16:25:13

0

您可以將此功能的虛擬。然後覆蓋第三類中的函數並引發異常。它會阻止開發人員在第三類中使用該函數。

+0

雖然這在技術上有效,但這不是一個好主意。這違反了Liskov替代原則。當你使用第三個類作爲基類時(它應該總是有效的),它會有意想不到的行爲。 – 2010-11-03 16:20:47

+0

問題是我不想在2個類中重複使用相同的函數,但這不會改變這一點。我希望能將這個功能集中到一個「地點」,那麼任何未來的修改(如果需要的話)都只能在一個地方,而不是2 – onaclov2000 2010-11-03 16:25:06

+0

@Reed。我同意你的看法,這不是一個乾淨的解決方案。我將SOLID校長視爲非常好的建議,應該如何實施。但是,如果我需要,我不介意打破它們。在構建架構中,您有構建代碼,但如果您查看傑作,偶爾會破壞這些代碼。你必須知道原則,但如果你知道自己在做什麼,可以打破原則。 – Vadim 2010-11-03 16:25:37