私はJava OOPの問題に悩まされています。私は問題を説明するために、いくつかのおもちゃのコードを思いついた。 1Java OOPの問題 - インタフェース/抽象クラスに関連する
クラス - - 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'が渡されます。いくつかのOOPテクニックを使用して、2つのメソッド呼び出し(setNameとsetNumWheels)を実行する方法がありますか?reportProblemが呼び出される前に?
私は自分自身を明確にしたいと思います。私がそうでないならば、私はあなたがそれをどのようにして、それから学ぶことができるかを教えてください。 「必要」
ありがとう!これはcarのコンストラクタからsuper.mName = "Car"を実行するよりはるかに優れています!これは私が欲しかったものです。 mNameとmNumWheelsはVehicleでプライベートにする必要があると思います。 – MediumOne
正しい。私はあなたが持っていたものをコピーしました。私のポストの最後のステートメントに注目してください。 –
ああああ!さっき気付いた。ありがとう! – MediumOne