2014-10-01 82 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