2017-01-17 4 views
2

я следующие классы:Как расширяет класс для принятия методов из двух других классов

class Vehicle { 
    public void Move() { 
     System.out.println("Move"); 
    } 
} 

class Bike extends Vehicle { 
    public void RideOnBackWheel() {} 
} 

class VehicleWithEngine extends Vehicle { 
    public void EngineStart() {} 
    public void EngineStop() {} 
} 

Теперь я должен создать класс мотоциклов с методами из велосипедного и VehicleWithEngine, но это не работает:

class Motorbike extends Bike, VehicleWithEngine { 
    private boolean engine = false; 

    @Override 
    public void EngineStart() { 
     engine = true; 
     System.out.println("Engine started."); 
    } 

    @Override 
    public void EngineStop() { 
     engine = false; 
     System.out.println("Engine stopped."); 
    } 

    @Override 
    public void RideOnBackWheel() { 
     if(engine) System.out.println("1 wheel"); 
    } 

    @Override 
    public void Move() { 
     if(engine) System.out.println("Motorbike.move()"); 
    } 
} 

Благодарим за любую помощь.

+0

Вы можете расширить только один «класс» на Java и реализовать несколько «интерфейсов» http://csis.pace.edu/~bergin/patterns/multipleinheritance.html – GOXR3PLUS

+0

Имена методов должны начинаться с строчных букв по соглашению. – shmosel

+0

вы можете сделать класс мотоциклов, в котором используется композиция, в которой класс содержит велосипед и автомобильWithEngine –

ответ

4

В java вы не можете наследовать два класса. Вы должны изменить классы Vehicle, Bike и VehicleWithEngine на интерфейсы, используя ключевое слово implements, а не extends в классе мотоциклов.

interface Vehicle 
{ 
    default public void Move() 
    { 
     System.out.println("Move"); 
    } 
} 

interface Bike extends Vehicle 
{ 
    public void RideOnBackWheel(); 
} 

interface VehicleWithEngine extends Vehicle 
{ 
    public void EngineStart(); 
    public void EngineStop(); 
} 

class Motorbike implements Bike, VehicleWithEngine 
{ 
    private boolean engine = false; 

    @Override 
    public void EngineStart() 
    { 
     engine = true; 
     System.out.println("Engine started."); 
    } 

    @Override 
    public void EngineStop() 
    { 
     engine = false; 
     System.out.println("Engine stopped."); 
    } 

    @Override 
    public void RideOnBackWheel() 
    { 
     if(engine) { System.out.println("1 wheel"); } 
    } 

    @Override 
    public void Move() 
    { 
     if(engine) { System.out.println("Motorbike.move()"); } 
    } 
} 
2

Похоже Bike и VehicleWithEngine фактически не имеют реализации. Если да, то вы можете превратить их в интерфейсах и имеют Motorbike реализовать оба:

interface Bike extends Vehicle { 
    void RideOnBackWheel(); 
} 

interface VehicleWithEngine extends Vehicle { 
    void EngineStart(); 
    void EngineStop(); 
} 

class Motorbike implements Bike, VehicleWithEngine { 
    // implementations 
} 

Если Bike и Vehicle имеют лица без реализации (они не должны непосредственно получить доступ к переменным-членам), вы можете превратить их в default methods, для пример:

interface Bike extends Vehicle { 
    default void RideOnBackWheel() { 
     // implementation 
    } 
} 

В противном случае невозможно продлить действие от двух классов. См. Связанный дубликат.

Смежные вопросы