我正在通过解决一些练习来学习,我必须使用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;
}
}
也许我缺少一些东西,而且我知道重复一些代码并不是世界末日,但是我真的很好奇,作为一个学生,我会以专业的方式来解决这一基本问题。
答案 0 :(得分:2)
看看按构成的设计与按继承的设计之间的区别:here。听起来很像您这里确实有几节课。 LicensePlate
类,LoadWeight
类以及您之前提到的所有车辆类。与“ is-a”类型关系相反,这两个新类都是“ has-a”类型关系(A Car
has-a LicensePlate
,Boat
has-a { {1}})。希望这可以帮助!
答案 1 :(得分:2)
或者,您可以将weight属性提取到接口:
public interface Weighted {
float getLoadWeight()
}
这样,您可以在需要时将其转换为“加权”,但仍必须单独实现该属性