构造函数不是类的成员吗?如果是,为什么不能继承它们?
JLS 7.0 says that constructors are not members因此无法继承。对Java来说这是真的吗?还是一般的OOP范例?
答案 0 :(得分:6)
由于良好的设计原因,构造函数不会被继承。如果它们是继承的,那么在尝试将它们隐藏在继承的类中时会遇到问题。
考虑这个例子:
class Plane{
public Plane(int passengerCapacity, int cargoCapacity){...}
}
class F18 extends Plane{
public F18(){
super(0,0);
....
}
}
现在,以下构造函数是否有意义?
Plane p = new F18(0,0);
不是真的,因为子类是父类的特例。在这个特定的例子中,在F18类中提供Plane构造函数是没有意义的。子类希望控制父类的构造方式。
如果构造函数是继承的,并且有人希望隐藏父构造函数,他们可能会尝试执行以下操作:
class F18{
Plane innerPlane;
public F18(){
innerPlane = new Plane(0,0);
}
}
不是真正的解决方案,因为在每个方法和属性中,都必须编写return innerPlane.SomeMethod();
,这几乎违背了继承的目的。
此主体也适用于其他OOP语言(例如C#)。
但是,如果我真的想在许多子类中继承构造函数,该怎么办...
然后你的架构是错误的。您实际上不需要继承来解决您的问题。您可以抽象另一个基类/接口中不同的部分。 e.g。
class Plane{
IPilot Pilot;
public Plane(int passengerCapacity, int cargoCapacity, IPilot pilot){...}
}
构造函数是构造对象的方法。你真的需要很多子类,它们可以以相同的方式构建(并使用相同的逻辑,因为它们是继承的),或者是一个可以灵活地交换掉它的一些组件的类吗?
答案 1 :(得分:2)
继承构造函数的概念在大多数范例中没有意义;相反,构造函数以相反的继承顺序调用,例如,如果你有:
Pidgeon -> Bird -> Animal
->
表示'继承自',然后构建Pidgeon
首先调用Animal
构造函数,然后调用Bird
构造函数,最后,Pidgeon
构造函数。如果它没有这样做,那么你必须初始化你所继承的类的所有成员或手动调用基类的构造函数(因为你可能不得不这样做 如果您要传递特定参数。
或者,放入另一个,而通常派生类中的函数替换基类中的函数,构造函数扩展基类中的函数。 / p>
答案 2 :(得分:0)
尽管您可能听到过,但这不是一般的OOP范例。我认为,有旧的OOP语言,其中构造函数只是常规方法。但目前许多流行语言都以不同的方式对待构造函数,就像其他方法一样。这是一个不完美的解决方案,导致一些变通方法,比如Beans规范中的建议只有非参数构造函数。