我应该使用Abstract还是Interface ...或者从应该扩展的Concrete类开始?

时间:2013-03-31 16:03:11

标签: java oop interface abstract concrete-inheritance

我对OO设计没有足够的把握来确定我是否设计好应用程序。

这是一个简单的想法:

我想编写一个在Metro上旅行的应用程序。

我开始定义以下内容:

定义一些方法的Trainline接口。 然后我创建一个名为Lines的具体类。 Lines类根本不做什么。 它有像getNumberOfStations()这样的方法,但它不知道任何数量的站,所以只返回null。

然后我有一个CentralLine类来完成实际工作,这扩展了Lines,这提供了真正的实现。

enter image description here

问题:

  1. 我需要“线”具体课吗?我是不是没有CentralLine和CircleLine实施TrainLines(这些都是伦敦地铁的火车线路)?
  2. 或者我应该删除TrainLines界面并且只有Lines具体类?
  3. 或者TrainLines应该是一个抽象类?
  4. 除了漂亮的类地图之外,接口或Lines超类是否提供任何值...参见上文:)
  5. OO为我做什么事情会很酷?我应该用OO设计做些什么?
  6. 谢谢!!!!

3 个答案:

答案 0 :(得分:1)

为什么不制作Linesabstract?你不会有“返回null”的问题=>非常非常难看。

在这种情况下,您将不再拥有TrainLines界面。

TrainLines如果您计划处理许多不同类型的Lines,其实现真的不同,那么界面会很有趣。通过使用TrainLines类型引用代码中的不同类,您可以获得更好的多态性。

总结一下,两种解决方案:

  • Lines因为抽象类遵循具体的类。
  • TrainLines作为接口后跟Lines(或其他类型),抽象类遵循具体类。

请记住,实现接口的抽象类不需要实现这些方法。实际上,抽象类可以将这种责任推迟到具体的阶级。因此,无需实现虚拟return null;)

答案 1 :(得分:1)

根据你到目前为止所展示的内容,你真的应该只有一个类:Line类。

有几个原因(回答1-4):

你应该谨慎使用继承。很难简单地说明为什么这只是继承,特别是在Java中(我们没有特性或多重继承和可变性是猖獗的)通常不是好的设计。您可以使用Google Gang of four composition over inheritance

课程不应该是具体的事情。那就是你不会使你的名字来自Human。类是一类东西。

如果您确实需要更多类型的Line,那么您只需重构。特别是在Java中,重构非常简单。我认为他们从根本上教授软件工程/设计错误的现实世界中发生的事情。在现实世界中,您不了解整个域(或分类法),因此您始终从最简单的模型开始,然后重构。

回答问题#5:

  

OO能为我做些什么事情会很酷吗?我应该用OO设计做些什么?

如果你不了解单元测试,你应该研究一下(如果你不能测试它,一个好的设计就没有意义......事实上如果你不能测试你的代码或者它很难测试=坏设计)。

使用OOP,您应该决定如何管理状态。 OOP非常善于管理内存状态。它的最大好处是可以建模诸如视频游戏或UI之类的东西,其中你有很多内存状态。

答案 2 :(得分:0)

在你的情况下,我没有看到任何真正的界面需求。 我会将Lines作为一个抽象类,并在Lines类中提供所有常见的实现。 CentralLine和CircleLine可以使用该默认实现,并为其余方法提供实现。

Thumb规则是,无论何时你有一些常见的实现,然后去抽象类,这适用于你的情况。

当您希望跨层次结构实现时,接口可能非常有用,同样的类可以实现多个有用的接口。 但是接口总是需要注意的是,如果必须添加新方法,则整个层次结构可能会中断,而在抽象类的情况下,您可以简单地将该默认实现放在Abstract类中而不更改其他任何内容。