[英]Inheritance and methods
我的类和子类的构造函数有问题(扩展了第一个类)
这是基本类的构造函数:
public Airplane(int x, int y, int width)
{
this.x = x;
this.y = y;
this.width = width;
createSeats();
}
这是扩展基本类的另一个类的构造函数
public Boeing(int x, int y, int width)
{
super(x,y,width);
createSeats();
}
问题在于createSeats()
是这两个类中的另一个方法,但Boeing
必须重写主要方法。 我如何才能做到这一点而又无需取出createSeats()
方法呢?
如果您知道要让Airplane
所有子类在构造时调用createSeats()
,则可以将该调用保留在Airplane
构造函数中,并从Boeing
删除。
如果只希望特定的子类,例如Boeing
在构造时调用createSeats()
,则可以将该调用保留在Boeing
构造函数中,然后从Airplane
删除。
您不需要这两个构造函数中的调用,将它们保留在那里将导致createSeats()
对于您初始化的每个Boeing
都被调用两次。
对超级构造函数的调用已经包括对createSeats()方法的调用,因此您不必将其重新包含在Boeing构造函数中。
如果您只想更改创建座位的行为,只需重写该方法即可。
class Airplane {
public Airplane(int x, int y, int width)
{
this.x = x;
this.y = y;
this.width = width;
createSeats();
}
void createSeats() { /* create them */ }
}
class Boeing {
public Boeing(int x, int y, int width)
{
super(x,y,width); // same steps as super class
}
@Override
void createSeats()
{
// do something else entirely
// possibly call super.createSeats()
}
}
通常,在超类中提供方法的默认实现,该方法使您可以通过重写子类中的方法来自定义子类中的行为。 例如, 飞机是否知道如何在波音 飞机上制造座位? 可能不是,因此您将重写子类中的createSeats ()以提供适用于您特定类型的Airplane的特定实现。
从您的超类的构造函数内部调用createSeats ()方法的事实保证了始终在对象的构造上调用该方法。 这是一种常见的设计模式。 这称为模板方法。 基本上,您有一个方法以某种顺序封装了许多方法的执行以产生结果。 在您的情况下,有一种方法称为createSeats ()。
我同意@milkplusvellocet的回答,但是您还说过“问题是createSeats()是这两个类中的另一种方法,但波音必须重写主要方法。” 如果您需要调用超类的方法而不是自己的方法,则可以始终调用super.createSeats()
。 这样,您始终可以区分超类中的方法和您自己的方法。
但是,那几乎总是在您要覆盖的方法中使用。 例如,
@Override
public void createSeats() {
doSomethingSpecial();
super.createSeats();
}
@Override
在您要覆盖的方法应做的工作之前
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.