0

スーパークラスまたはサブクラスのオブジェクトをメソッドに送信する必要があるコードを扱っています。

このメソッドpublic void repair(Vehicle vehicle)は、スーパー クラス オブジェクトのメソッドにのみアクセスします。

public class Vehicle {
    //class stuff
}

public class Car extends Vehicle {
    //class stuff
}

public static void main(String[] args) 
{
    // do stuff to determine whether working with a vehicle or car
    if (someCondition)
    {
        Car = new Car();
        // do some stuff...
        repair(Car);
    }
    else
    {
        Vehicle = new Vehicle();
        // do some stuff...
        repair(Vehicle);
    }
}   

3つのオプションがあると思います:

  1. コードはそのままにしておいてください。動作しているようです。- 私はこのオプションが好きではありません。仮定をしているように感じます。これを行うと、車のみのメソッドが誤って呼び出され、予期しない動作につながる可能性があるのではないかと思います。
  2. car に getVehicle() メソッドを作成して、Vehicle を返します。次に使用しますrepair(Car.getVehicle());-これは少し気分が良くなります
  3. タイプのメソッドのみを実行できるオブジェクト(車両)を作成すると私が信じているCar = new Car();変更。Vehicle = new Car();- 予期しない動作を防ぐために、できることを制限しているので、これが最も安全だと感じています。

修復方法が車両のみを想定していることを考えると、3 が最善のアプローチでしょうか?

また、public void repair(Vehicle vehicle)メソッド宣言に対してできる/すべきことはありますか?

編集:私は使用する必要があるようです:

コードはそのまま

いずれにせよ、repair()メソッドはサブクラス オブジェクトをスーパークラス オブジェクトにキャストするためです。

4

1 に答える 1

8

修理の定義はありませんが、このようなものが欲しいと思います

public abstract class Vehicle {
    //class stuff
}

public class Car extends Vehicle {
   //class stuff
}


public class Garage {
   public void repair(Vehicle vehicle){
   ....
   }
}

次に、Vehicle の任意のサブクラスを repair メソッドに渡すことができます。この場合は車のみですが、自転車、オートバイなどに拡張することもできます。

これで、if ステートメントで確認する必要がなくなります。オブジェクト (または Car など) をrepairメソッドに渡すだけです。

あなたのメインはちょうどなる

public static void main(String[] args)  {
    Garage g = new Garage();
    Vehicle c = new Car();
    Vehicle b = new Bike(); //assuming Bike is a subclass of Vehicle.
    g.repair(c);
    g.repair(b);
}  

変数 b および c にアクセスするときに Car および Bike 固有のメソッドが必要な場合は、それらの宣言を次のように変更できます。

Car c = new Car();
Bike b = new Bike();
于 2012-10-11T09:46:02.913 に答える