我会选择Java作为一个例子,大多数人都知道它,尽管其他所有OO语言都可以正常工作.
与许多其他语言一样,Java具有接口继承和实现继承.例如,Java类可以从另一个继承,并且每个在其中具有实现的方法(假设父级不是抽象的)也是继承的.这意味着接口是继承的,也是此方法的实现.我可以覆盖它,但我没有.如果我不覆盖它,我继承了实现.
但是,我的类也可以"继承"(不是用Java术语)只是一个接口,没有实现.实际上接口实际上是用Java命名的,它们提供了接口继承,但没有继承任何实现,因为接口的所有方法都没有实现.
现在有这篇文章,说继承接口比实现更好,你可能想读它(至少在第一页的前半部分),这很有意思.它避免了脆弱的基类问题.到目前为止,这一切都很有意义,文章中说的许多其他内容对我来说很有意义.
让我感到困惑的是,实现继承意味着代码重用,这是OO语言最重要的属性之一.现在,如果Java没有类(如James Gosling,Java的教父希望根据本文),它解决了实现继承的所有问题,但是如何使代码重用成为可能呢?
例如,如果我有一个类Car和Car有一个方法move(),这会使Car移动.现在我可以为不同类型的汽车分类汽车,这些都是汽车,但都是汽车的专用版本.有些可能以不同的方式移动,这些需要覆盖move(),但大多数只会保留继承的移动,因为它们像抽象的父Car一样移动.现在假设在Java中只有接口,只有接口可以相互继承,一个类可以实现接口,但所有类都是final,所以没有类可以从任何其他类继承.
如果你有一个Interface Car和100个Car类,你需要为每个类实现相同的move()方法吗?OO世界中存在除了实现继承之外的代码重用的哪些概念?
有些语言有Mixins.Mixins是我问题的答案吗?我读到了它们,但我无法想象Mixins如何在Java世界中运行,以及它们是否真的可以在这里解决问题.
另一个想法是,有一个类只实现Car接口,让我们称之为AbstractCar,并实现move()方法.现在其他汽车也实现了Car接口,在内部他们创建了一个AbstractCar实例,他们通过在内部抽象Car上调用move()来实现自己的move()方法.但这不会浪费资源(一种方法只调用另一种方法 - 好吧,JIT可以内联代码,但仍然)并使用额外的内存来保存内部对象,你甚至不需要实现继承?(毕竟每个对象都需要更多的内存,而不仅仅是封装数据的总和)对于程序员来说,编写虚拟方法也不是很尴尬
public void move() {
abstractCarObject.move();
}
Run Code Online (Sandbox Code Playgroud)
?
任何人都可以想象一个更好的想法如何避免实现继承,仍然能够以简单的方式重用代码?
在你开始向我射击之前,我不打算这样做,但是另一篇文章中有人说这是可能的.这怎么可能?我从未听说过使用反射继承任何东西.但我看到一些奇怪的事情......