Java OOP の問題で立ち往生しています。問題を説明するために、おもちゃのコードをいくつか考え出しました。ここに私のクラスがあります -
クラス 1 - Car.java
public class Car {
public void reportProblem(String problem){
ReportUtil.reportVehicleInfo("Car", 4, problem); //4 is number of wheels
}
//bunch of other methods
}
クラス 2 - Truck.java
public class Truck {
public void reportProblem(String problem){
ReportUtil.reportVehicleInfo("Truck", 6, problem);
}
//bunch of other methods
}
クラス 3 - ReportUtil.java
public class ReportUtil {
public static void reportVehicleInfo(String name, int wheels, String problem){
System.out.println(String.format("%s %s %s", name, wheels, problem));
}
}
クラス 4 - Test.java
public class Test {
public static void main(String[] args) {
Car c = new Car();
c.reportProblem("puncture");
Truck t = new Truck();
t.reportProblem("engine missing");
}
}
「Car」と「Truck」の「reportProblem」メソッドの実装を親クラスに抽象化したい。これは私がしたことです -
クラス 1 - Vehicle.java
public abstract class Vehicle {
public String mName;
public int mNumWheels;
public void reportProblem(String problem){
ReportUtil.reportVehicleInfo(mName, mNumWheels, problem);
}
public void setName(String name){
mName = name;
}
public void setNumWheels(int numWheels){
mNumWheels=numWheels;
}
}
クラス 2 - Car.java
public class Car extends Vehicle {
//bunch of other methods
}
クラス 3 - Truck.java
public class Truck extends Vehicle {
//bunch of other methods
}
クラス 4 - ReportUtil.java (このクラスは変更されていません)。
public class ReportUtil {
public static void reportVehicleInfo(String name, int wheels, String problem){
System.out.println(String.format("%s %s %s", name, wheels, problem));
}
}
クラス 5 - Test.java
public class Test {
public static void main(String[] args) {
Car c = new Car();
c.setName("Car"); //NOTE : Can be missed!
c.setNumWheels(4); //NOTE : Can be missed!
c.reportProblem("puncture");
Truck t = new Truck();
t.setName("Truck"); //NOTE : Can be missed!
t.setNumWheels(6); //NOTE : Can be missed!
t.reportProblem("engine missing");
}
}
これは私が望むものを達成します(「reportProblem」の実装を抽象化しました)。しかし、これが最善の方法ではないことはわかっています。理由の 1 つは、「setName」および「setNumWheels」メソッドを呼び出さずに「reportProblem」メソッドを呼び出すべきではないことです。それ以外の場合は「null」が渡されます。reportProblem が呼び出される前に、何らかの OOP 手法を使用して、2 つのメソッド呼び出し (setName と setNumWheels) を強制する方法はありますか?
私は自分自身を明確にしたことを願っています。そうでない場合は、そこから学ぶことができるように、どのようにしてそれを行うかを教えてください.