有 Java 编程相关的问题?

你可以在下面搜索框中键入要查询的问题!

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

我通过解决一些练习来学习,我必须使用Java创建一个Android应用程序,这个应用程序有三个主要类,分别是汽车、船和拖车。这三个类别共享一些属性,例如,汽车和拖车都有牌照,汽车和船都有载重。现在我要做的是创建两个抽象类,Vehicle和VehicleWithPlate,其中Car继承自VehicleWithPlate,Boat继承自Vehicle。VehicleWithPlate继承自Vehicle

这甚至可能不是最好的方法,但现在的问题是,我需要在其中一个超类中实现负载重量,并创建一个重量不是最佳选择的车辆,因为如果一辆车辆既有重量,又有一个板,就会发生冲突。我知道在Java中“实现”多重继承的一种方法是使用接口,我知道接口只实现抽象方法,而不是属性。最好的方法是什么?到目前为止,我的解决方案是将loadWeight属性单独应用到车辆和船只中,但这看起来并不干净

汽车

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;
    }
}

带牌照的车辆

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) 个答案

  1. # 1 楼答案

    看看按组合设计和按继承设计之间的区别:here。听起来你在这里真的有几门课。一个LicensePlate类,一个LoadWeight类,以及您之前提到的所有车辆类。这两个新类都是“has-a”类型关系,而不是“is-a”类型关系(aCarhas-aLicensePlate,aBoathas-aLoadWeight)。希望这有帮助

  2. # 2 楼答案

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

    public interface Weighted {
        float getLoadWeight()
    }
    

    这样,您可以在需要时向上转换为“加权”,但仍然需要单独实现该属性