从Java中的多个父类/超类继承属性

时间:2019-06-15 00:32:19

标签: java

我正在通过解决一些练习来学习,我必须使用Java创建一个Android应用程序,该应用程序具有3个主要的类,分别是Car,Boat和Tow。这3个类别共享一些属性,例如Car和Tow都具有牌照,而Car和Boat都具有负载重量。现在,我正在创建两个抽象类,Vehicle和VehicleWithPlate,其中Car从VehicleWithPlate继承而Boat则从Vehicle继承。 VehicleWithPlate继承自Vehicle。

这可能甚至不是最好的方法,但是现在的事情是,我需要将负载重量实现为这些超类之一,并且创建VehicleWithWeight并不是最佳选择,因为如果车辆既有重量又有重量盘子,会有冲突。我知道在Java中“实现”多重继承的一种方法是使用接口,并且我知道接口仅实现抽象方法,而不是attribute。这样做的最佳方法是什么?到目前为止,我的解决方案是将loadWeight属性分别实现为Vehicle和Boat,但这看起来并不干净。

汽车

public class Car extends VehicleWithPlate{

    private float loadWeight;

    public Car(String plate, int passengersNum, int maxPassengers, float loadWeight) {
        super(plate, passengersNum, maxPassengers);
        this.loadWeight= loadWeight;
    }

    public float getLoadWeight() {
        return loadWeight;
    }
}

public class Boat extends Vehicle{
    private float loadWeight;

    public Barco(int passengersNum, int maxPassengers, float loadWeight) {
        super(passengersNum, maxPassengers);
        this.loadWeight= loadWeight;
    }

    public float getLoadWeight() {
        return loadWeight;
    }

}

车辆

public abstract class Vehicle {
    protected int passengersNum;
    protected int maxPassengers;

    public Veiculo(int passengersNum, int maxPassengers){
        this.passengersNum= passengersNum;
        this.maxPassengers= maxPassengers;
    }
}

VehicleWithPlate

public abstract class VehicleWithPlate extends Vehicle {
    protected String plate;

    public VehicleWithPlate (String plate, int passengersNum, int maxPassengers) {
        super(passengersNum, maxPassengers);
        this.plate= plate;
    }

    public String getPlate() {
        return plate;
    }
}

也许我缺少一些东西,而且我知道重复一些代码并不是世界末日,但是我真的很好奇,作为一个学生,我会以专业的方式来解决这一基本问题。

2 个答案:

答案 0 :(得分:2)

看看按构成的设计与按继承的设计之间的区别:here。听起来很像您这里确实有几节课。 LicensePlate类,LoadWeight类以及您之前提到的所有车辆类。与“ is-a”类型关系相反,这两个新类都是“ has-a”类型关系(A Car has-a LicensePlateBoat has-a { {1}})。希望这可以帮助!

答案 1 :(得分:2)

或者,您可以将weight属性提取到接口:

public interface Weighted {
    float getLoadWeight()
}

这样,您可以在需要时将其转换为“加权”,但仍必须单独实现该属性