2014-10-01 46 views
1
abstract class db{ 
    // return an handle to db 
} 

class type extends db{ 
    // code that uses db 
} 

abstract class limits extends db{ 
    // code that DOES NOT use db 
} 

class otherclass extends limits{ 
    // code that use db and limits 
} 

正如你所看到的,我需要除了限制以外的所有類的db。但限制是使用db的類的父類。 我認爲這不是正確的設計模式,因爲我在限制範圍內擴展db只是爲了讓db可用於兒童。或者是? 謝謝。面向對象設計的繼承建議

+0

這是極限類存在的唯一原因嗎?在那種情況下:擺脫那個職業 – 2014-10-01 08:54:32

+0

沒有文森特。極限班做了其他兒童需要的工作。 – Paolo 2014-10-01 08:56:03

+2

爲什麼擴展'db'如果它不「使用」它 - 當然使用指示組合不是繼承。爲什麼限制需要基類/接口? – doctorlove 2014-10-01 08:56:30

回答

5

根據未規定的要求,在這種情況下,您最好用組合代替繼承。

class db { 
    // returns db handle 
} 

class type { 
    private db; // type can now use db 
} 

class limits { 
    // does something 
} 

class otherclass { 
    private limits; 
    private db;  // can use limits and db 
} 
+2

+1。主要是因爲它們之間沒有任何繼承關係的四個類只是很漂亮:-)子類化是OOP中最爲嚴重的/過度使用的方面。 – Thilo 2014-10-01 08:57:58

+0

看起來你是完全正確的md4。我是OOP的新手。我會嘗試你的建議。 – Paolo 2014-10-01 09:01:57

1

你說:「我需要除限制以外的所有類中的db」。這表明你應該編寫(或包含)一個不從它繼承的數據庫。請參閱md4的答案。

你需要考慮爲什麼你可能有抽象類 - 這通常是因爲你想「編程到接口」來產生一個短語。

也許dblimits是兩回事 - 認爲單一職責......

abstract class db { 
    // returns db handle 
} 

abstract class limits { 
    // does something 
} 

class otherclass : extends limits, db { 
} 

......編輯開始...
顯然,對於一些特定的面嚮對象語言,如Java和C#limitsdb將需要是interface s而不是類。 OP沒有指定一種語言。
......編輯結束...

想想使用代碼 - 考慮寫一些單元測試,看看是什麼樣子。考慮一下必須改變什麼以及應該怎樣去耦合。

+0

我更喜歡你的答案。它給OP更多的思考。 – md4 2014-10-01 09:06:43

+0

話雖如此,你的'otherclass'似乎在嘗試多重繼承,而不是我所知的Java支持的東西(我認爲OP將使用)。 – md4 2014-10-01 09:09:17

+0

正確 - 但沒有語言標記...我在C++中拼寫「接口」「抽象類」,但後來我不說「擴展」 – doctorlove 2014-10-01 09:10:12