2012-04-12 160 views
0

我遇到的类别和子类的构造函数的问题(即扩展头等)继承和方法

这是基本类的构造函数:

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()方法呢?

+0

如果您在波音创建了一个新的'createSeats()'方法,那么它将覆盖'Airplane'中的一个。你在做什么? – kba 2012-04-12 23:43:20

+0

为什么它不按照你的方式工作? – jahroy 2012-04-12 23:43:44

+0

不调用super(x,y,width)调用createSeats();在构造函数中呢? – JA3N 2012-04-12 23:46:38

回答

1

如果你知道你想要的Airplane所有子类调用施工createSeats()然后你可以离开中的呼叫Airplane构造,并从Boeing删除。

如果您只想要特定的子类,例如Boeing致电createSeats()正在建设中,那么您可以在Boeing的构造函数中留下呼叫,并从Airplane中删除。

需要在这两个构造函数调用次数,使他们有将导致createSeats()你初始化每个Boeing被称为两次。

+0

所有类和子类都需要createSeats()方法,它是波音公司的createSeats()方法重写了飞机中的方法 – JA3N 2012-04-12 23:55:05

+0

如果是这种情况,那么将其从子类构造函数中删除。覆盖方法将在超类缩瞳中调用。 – darrengorman 2012-04-12 23:58:22

+0

@ JA3N很好。调用'Airplane.createSeats()'将会调用'Boeing.createSeats()',如果它被'Boeing'覆盖。所以效果会一样。如果你想从覆盖的方法调用'Airplane.createSeats()'看到我的答案。 – 2012-04-13 00:00:09

0

对super构造函数的调用已经包含对createSeats()方法的调用,所以您不必在波音构造函数中重新包含它。

如果您只想更改创建座位的行为,请覆盖该方法。

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() 
    } 
} 
-2

@覆盖

前要覆盖应该做的工作

+1

这只是提供了一个编译时检查,注释的方法覆盖了一些超类的方法。它不会以任何方式改变行为。 – darrengorman 2012-04-13 00:02:29

0

常见的方法的默认实现在一个超类提供,它允许您自定义的行为的方法通过重写子类中的方法来创建子类。例如。 飞机是否知道如何在波音上创建座位?可能不会,因此你会覆盖createSeats()在你的子类提供特定的实现,适用于你的特定类型的飞机

从超类的构造函数内部调用createSeats()方法的事实可以保证在构造对象时总会调用所讨论的方法。这是一种常见的设计模式。它被称为模板方法。基本上你有一种方法,它以一定的顺序封装了一些方法的执行,以产生一个结果。在你的情况下,有一种方法,即createSeats()。

0

我同意@ milkplusvellocet的回答,但是你也说过“问题是createSeats()是两个类中的另一种方法,但是波音必须覆盖主类。”如果您需要调用超类的方法而不是您自己的方法,则始终可以调用super.createSeats()。这样,您总是可以区分超类中的方法和您自己的方法。

但是,那就是说,这几乎总是用在你重写的方法中。例如,

@Override 
public void createSeats() { 
    doSomethingSpecial(); 
    super.createSeats(); 
}