我对这样的采访有疑问......
如果让JAVA决定从编程语言中删除继承,并且你有超过1000个使用继承的类(超类),那该怎么办?如果你想改变超类中的某些东西(例如一个方法或更多方法),你会如何解决这个问题?最快最有效的方式?
你怎么看? :) 编辑:嘿,大家好,我知道它不符合逻辑,Java不会这样做,它不是OOP的基本概念......但这是一个心灵弯曲的问题......你如何解决你“共享”的问题应用程序周围的代码,现在你不再有这个功能。你会如何解决它?答案 0 :(得分:4)
我认为问题所在的是赞成composition over inheritance的概念。
假设我们有这种层次结构:
class Parent{
public String getName(){
return "xyz";
}
}
class Child extends Parent{}
我们可以通过构图实现类似的关系:
class Parent{
public String getName(){
return "xyz";
}
}
class Child{
private Parent myParent;
public String getName(){
return myParent.getName();
}
}
这是一个过于简单的例子,但基础知识就在那里。有关详细信息,请参阅this问题的答案。
答案 1 :(得分:1)
由于这是一个“假设”问题,我认为有效的尝试回答它
由于删除继承意味着使用扩展和实现删除使用接口或扩展抽象类将无法使用
我的方法:用一个具有公共静态属性的类替换超类,并使用public(有时是静态的)方法,使其成为所有其他类调用和替换对这些方法的超级调用的公共访问点。
通过这种方式,大多数逻辑属性仍然属于单个类。
答案 2 :(得分:0)
首先,没有继承就没有OOP概念,因此Java团队永远不会这样做,因为java中的每个class
都扩展了java.lang.Object
。
恕我直言,他们希望了解您是否理解inheritance
。因为如果删除了inheritance
,那么根本就没有Super
类的概念。所以没有必要考虑“最快捷有效的方式”。
我们假设没有继承,您修改了代码以使用class associations
删除错误。任何流行的IDE都会很容易地做到这一点。
例如,在Eclipse中,选择方法 - >按 Alt + Shift + R (修改所有引用)。因此,该问题的另一个目标可能是测试您对IDE使用的了解。
答案 3 :(得分:0)
根据您的假设,最快和最有效的方法是保持当前的Java版本和/或等到一些爱好者团队将分叉OpenJDK以比删除继承更合理的方式发展它。
答案 4 :(得分:0)
即使语言支持继承,也有继承的替代模式,当然从类继承导致2个类紧密耦合时,考虑继承是否始终是正确的方法,这是值得的。
作为一个例子,我最近阅读了关于类型模式的精彩文章/章节(此处可用 - http://gameprogrammingpatterns.com/type-object.html)。本书中有许多可能适用的模式,以这种方式使用,绝对值得一读。
当然,将这种模式(或任意数量的替代模式)应用于所有1,000个类可能需要一段时间。
另一种选择是自己实现一种简单的继承形式来替换被删除的那种。这并不常见,例如,有许多JavaScript和Lua库(我确信还有很多其他的库)可以添加类似行为的支持,包括继承。这是多么困难取决于语言的属性。
这里有很多警告,包括性能和支持1,000个类所依赖的继承的每个功能 - 但是在Java将继承作为一个功能的任何可能的世界中都是可能的。