2012-04-12 3 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()' в Boeing, то он будет переопределять значение из 'Airplane'. Что вы пытаетесь сделать? – kba

+0

Почему это не работает так, как у вас есть? – jahroy

+0

Не вызывает вызов super (x, y, width) createSeats(); в конструкторе? – JA3N

ответ

1

Если вы знаете, что вы хотите, чтобы все подклассы Airplane позвонить createSeats() на строительство, то вы можете оставить вызов в Airplane конструктору и удалить из Boeing.

Если вам нужны только определенные подклассы, например. Boeing, чтобы позвонить по телефону createSeats() по строительству, тогда Вы можете оставить заявку в конструкторе Boeing и убрать из Airplane.

Вы не нужны вызовы в обоих конструкторах, оставляя их там приведет к createSeats() вызывается дважды для каждого Boeing вы инициализируются.

+0

Все классы и подклассы нуждаются в методе createSeats(), это то, что метод createSeats() в Boeing переопределяет метод в Airplane – JA3N

+0

Если это так, удалите его из конструктора подкласса. В суперклассе constrictor будет задействован метод переопределения. – darrengorman

+0

@ JA3N Все в порядке. Вызов 'Airplane.createSeats()' будет вызывать 'Boeing.createSeats()', если он был отменен 'Boeing'. Таким образом, эффект будет таким же. См. Мой ответ, если вы хотите вызвать 'Airplane.createSeats()' из переопределенного метода. –

0

Вызов суперконструктора уже включает вызов метода 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() 
    } 
} 
-2

@Override

перед метод, который вы хотите переопределить должны сделать работу

+1

Это просто обеспечивает проверку времени компиляции, когда аннотированный метод переопределяет некоторый метод суперкласса. Это никак не изменяет поведение. – darrengorman

0

Часто реализация по умолчанию метода обеспечивается в супер-класса, который позволяет настраивать поведение подкласс путем переопределения метода в подклассе. Например. Есть ли Самолет умеет создавать места на Boeing? Вероятно, нет, поэтому вы бы переопределилиcreateSeats() в вашем подклассе, чтобы обеспечить конкретную реализацию, которая работает для вас определенного типа Самолет.

Тот факт, что метод createSeats createSeats() вызывается из конструктора суперкласса, гарантирует, что данный метод всегда будет вызываться при построении объекта. Это общий шаблон проектирования. Это называется методом шаблонов. В принципе у вас есть метод, который инкапсулирует выполнение ряда методов в определенном порядке для получения результата. В вашем случае есть один метод: createSeats().

0

Я согласен с ответом @ milkplusvellocet, однако вы также сказали: «Проблема в том, что createSeats() - это еще один метод в обоих классах, но Boeing должен переопределить основной». Если вам когда-нибудь понадобится вызывать метод суперкласса, а не свой собственный, вы всегда можете позвонить super.createSeats().Таким образом, вы всегда можете различать методы в суперклассе и ваши собственные методы.

Однако, это говорит о том, что это почти всегда используется в методе, который вы переопределяете. Например,

@Override 
public void createSeats() { 
    doSomethingSpecial(); 
    super.createSeats(); 
} 
Смежные вопросы