0

いくつかのクラスがあります。

ファサードには、インスタンス化され、そこからすべてのメソッドを呼び出すスタータークラスがあります。

それから私は車のクラス、そして所有者のクラス、ガレージのクラス、そして駐車スペースのクラスを持っています

だから...スターターには車の属性があります。
車には所有者属性があります。
車にはガレージ属性もあります。
ガレージにはParkingSpace属性があります

Staterクラスには、CarクラスgetOwner()のメソッドを呼び出すメソッドがありますgetOwner()

private Car car;
public Starter (String name){
    car = new Car(new Owner(name);
}

上記の3行目は、CarオブジェクトとOwnerオブジェクトをインスタンス化します。これにより、さまざまなクラスからさまざまなメソッドを呼び出すことができるようになりました。

addParking()スタータークラスにメソッドがあります。スタータークラスのaddParking()は、CarクラスのaddParking()を呼び出します。次に、GarageClassからaddParking()を呼び出します。これにより、駐車スペースがガレージクラスに格納されているコレクションに追加されます。

私が理解できないのは...ガレージオブジェクトをどのようにインスタンス化するのか、そして何をインスタンス化するのかという観点からです。私のaddParking()メソッドはCarまで機能します。これは、Ownerを取得したときにすでにこれをインスタンス化したためです。だから私は今行くことができません...

Car car = new Car(new Grarage(new ParkingSpace(int x, int y, int z)));

または私はできますか?これにより、まったく新しいCarオブジェクトが作成されませんか?

4

2 に答える 2

2

Garage オブジェクトをインスタンス化する方法と、それをインスタンス化する対象について教えてください。

通常、このような疑問に行き詰まると、自然と自分のドメイン モデルに戻ります。には駐車スペースが必要ですが、 (まだ) または が含まれていない可能性があるため、クラスは駐車スペースのみと結合する必要がありますGarageGarageCar

public class Garage{
  public Garage(ParkingSpace parkingSpace){
     //...
  }
}

Carこれで aをこれにパークできるので、 にメソッドがあるGarageのは理にかなっています。Garage

public void park(Car car){
}

これらのコードは、次の方法でリンクできるようになりました。

Car car = new Car(owner);
Garage garage = new Garage(new ParkingSpace(...));
garage.park(car);

これにより、まったく新しい Car オブジェクトが作成されませんか?

はい、Car car = new Car(new Grarage(new ParkingSpace(int x, int y, int z)));新しい を作成CarGarageParkingSpace

于 2012-07-02T19:38:18.250 に答える
0

コンストラクターを確実に呼び出すと、Garageの新しいインスタンスが作成されます。デフォルトのコンストラクターを維持し、ガレージにゲッターとセッターまたはアダーメソッド(車はコレクションに格納されていますか?)を提供して、オブジェクト間の関係を作成する方がよいと思います。後で、どの関係を破棄できないかを考えることができます。 、セッターを消去し、コンストラクターを介して関係を作成します。

   class Garage { 

    public Garage(){}

    private ParkingSpace ps;

    public void setParkingSpace(ParkingSpace ps){
      this.ps = ps;
    }

    public ParkingSpace getParkingSpace(){
      return ps;
    }
    public void addCar(Car car){
     // add  to some collection...
     }
    public void removeCar(Car car){
      // and remove...
     }
    }

オブジェクトのライフサイクルは非常に異なっているようです。私はParkingSpaceとParkを車とは別に作成し、必要な場合にのみセッターとの関係を構築します。あなたは2つのことを考える必要があります:1)私はオブジェクトを作成するために何が必要ですか?他にどのオブジェクトに依存していますか?2)あなたの関係は読み取り専用ですか、それとも読み取り/書き込みですか?車を立証するために公園は必要ないようです。そうでない場合は、車を所有する前に公園を作成してください。それが唯一の方法です。

    class ParkingSpace{
        private int x;
        private int y;
        private int z;

      public ParkingSpace(int x, int y,int z){
        this.x = x;
        this.y = y;
        this.z = z;
     }

     //... other methods
    }

    class  Park {

       private final List<ParkingSpace> parkingSpaces = new ArrayList<ParkingSpace>();

       public void addParkSpace(ParkingSpace ps){
         parkingSpaces.add(ps);
       }
       // other methods...

    }
     }

    class Car {

       private final Owner owner;
       private Park park;
       public Car(Owner o){
           this.owner = o;
       }

       public Owner getOwner(){
           return owner;
       }

       public Park getPark(){ return park}
       public void setPark(Park p){park = p}

そしてあなたが持っているであろうコードで:

Owner o = new Owner("John Doe");
Car c = new Car(o);
Park p = new Park();
ParkingSpace ps = new ParkingSpace(1,2,3);
p.addParkSpace(ps);
car.setPark(p);
于 2012-07-02T19:45:12.193 に答える