继承和接口
这是这个问题的一个后续问题。
假设我有一个继承树,如下所示:
Car -> Ford -> Mustang -> MustangGT
定义每个类的接口是否有好处? 例:
ICar -> IFord -> IMustang -> IMustangGT
我可以看到,也许其他类(如Chevy
)想要实现Icar
或IFord
,甚至IMustang
,但可能不是IMustangGT
因为它非常具体。 在这种情况下界面是多余的?
另外,我认为任何希望实现IFord
类肯定会想要通过继承Ford
来使用它的一个继承,以免重复代码。 如果这是给定的,那么IFord
实施IFord
什么好处?
根据我的经验,如果有几个类需要响应相同的方法或多个方法,以便可以通过其他代码与这些类的通用接口进行交互使用,则最好使用接口。 接口的最佳用途是协议很重要,但每个类的底层逻辑可能不同。 如果否则会重复逻辑,请考虑抽象类或标准类继承。
针对你的问题的第一部分,我建议不要为你的每个类创建一个接口。 这会不必要地混乱你的班级结构。 如果你发现你需要一个界面,你可以随时添加它。 希望这可以帮助!
亚当
我也同意adamalex的回应,接口应该由应该对特定方法做出响应的类共享。
如果类具有相似的功能,但在祖先关系中彼此之间没有直接关系,那么接口将是将这个功能添加到类中的好方法,而不会在两者之间重复功能。 (或者只有很多实现,只有很细微的差别。)
我们使用汽车比喻,一个具体的例子。 假设我们有以下类:
Car -> Ford -> Escape -> EscapeHybrid
Car -> Toyota -> Corolla -> CorollaHybrid
汽车有wheels
,可以Drive()
和Drive()
Steer()
。 所以这些方法应该存在于Car
类中。 (可能Car
类将是一个抽象类。)
沿着这条路线,我们可以区分Ford
和Toyota
(可能是因为汽车上的徽章类型不同,也可能是抽象类别)。
然后,最后我们有一个Escape
和Corolla
课程,这些课程是作为汽车完全实施的。
现在,我们如何制造混合动力车?
我们可以有一个子类, Escape
是EscapeHybrid
增加了一个FordsHybridDrive()
方法,和子类Corolla
是CorollaHybrid
与ToyotasHybridDrive()
方法。 方法基本上是做同样的事情,但我们有不同的方法。 呸。 似乎我们可以做得比这更好。
假设混合动力车有一个HybridDrive()
方法。 由于我们不想结束两种不同类型的混合动力车(在一个完美的世界中),所以我们可以制造具有HybridDrive()
方法的IHybrid
接口。
所以, 如果我们想要制作EscapeHybrid
或CorollaHybrid
类 ,我们所要做的就是实现IHybrid
接口 。
对于真实世界的例子,我们来看看Java。 可以将对象与另一个对象进行比较的类实现Comparable
接口。 顾名思义,接口应该是一个可比较的类,因此名称为“Comparable”。
就感兴趣的问题而言,Java Tutorial的Interfaces课程中使用了一个汽车示例。
你根本不应该实现任何这些接口。
类继承描述了一个对象是什么 (例如:它的身份)。 这很好,但是大多数情况下,对象所处的位置远不如对象所做的重要。 这是接口进来的地方。
一个接口应该描述一个对象的作用) ,或者它的行为。 通过这个,我的意思是它的行为,以及在给定行为的情况下有意义的一组操作。
因此,好的接口名称通常应该是IDriveable
, IHasWheels
等等。 有时候描述这种行为的最好方法是引用一个众所周知的其他对象,所以你可以说“像其中一个行为”(例如: IList
),但是恕我直言,这种命名形式是少数。
鉴于这种逻辑,接口继承有意义的场景与对象继承有意义的场景完全和完全不同 - 通常这些场景根本不涉及对方。
希望可以帮助您通过您实际需要的接口进行思考:-)
链接地址: http://www.djcxy.com/p/38145.html