2012-02-29 27 views
1

を継承する場合、私はこのようになりますクラスの場所を作ったコンストラクタとgetterメソッドをコピーします。混乱、

package TruckingCompany; 

public class Location 
{ 
    private double x; 
    private double y; 
    private static final double xMax=1000.0; 
    private static final double xMin=-1000.0; 
    private static final double yMax=1000.0; 
    private static final double yMin=-1000.0; 
    public Location() 
    { 
     setX(0.0); 
     setY(0.0); 
    } 
    public Location(double x,double y) 
    { 
     setX(x); 
     setY(y); 
    } 
    public Location(Location location) 
    { 
     setX(location.getX()); 
     setY(location.getY()); 
    } 
    public void setX(double x) 
    { 
     if(x>=xMin && x<=xMax) 
     this.x=x; 
    } 
    public void setY(double y) 
    { 
     if(y>=yMin && y<=yMax) 
     this.y=y; 
    } 
    public void set(double x,double y) 
    { 
     setX(x); 
     setY(y); 
    } 
    public double getX() 
    { 
     return x; 
    } 
    public double getY() 
    { 
     return y; 
    } 
    public double getDistanceFrom(Location from) 
    { 
     double dx,dy; 
     dx=getX()-from.getX(); 
     dy=getY()-from.getY(); 
     return Math.sqrt(Math.pow(dx, 2.0)+Math.pow(dy, 2.0)); 
    } 
    @Override 
    public String toString() 
    { 
     return "(" + x + " , " + y + ")"; 
    } 
} 

したがって、このクラスに基づいて、私は継承するクラスの車両を、作りたいですロケーション。 しかし、私は他のクラスを作りたいので、私はそれをMovableというインターフェースを実装しなければなりません。そして、会社(私のプロジェクトはトラック会社をシミュレートします)はVehicleのArrayListを使うことができます。私は、タグ<T implements Movable>でメソッドを呼び出す必要があります。そのため、私はインターフェイスを作ったのです。

だから、これはクラスの車両である:

package TruckingCompany; 

public class Vehicle extends Location,implements Movable 
{ 
public void setLocation(Location location) 
{ 
    set(location.getX(),location.getY()); 
} 
public Location getLocation() 
{ 
    return new Location(getX(),getY()); 
} 
} 

そして、これは、インタフェースに移動可能である:

package TruckingCompany; 

import java.sql.Time; 

public interface Movable 
{ 
public void setLocation(Location location); 
public Location getLocation(); 
public void move(Time howLong); 
public void setDirection(double degrees); 
public Time getReachingTime(Location to); 
} 

だからのgetLocation getterメソッド作ることが正しいのですか?それはクローンではありませんか? また、Cloneableを実装して、それをクローンメソッドにすることもできます。 もう1つのオプションは、getterメソッドではなくコピーコンストラクタにすることです。 実際に話すと、どのオプションが正しいですか?

+2

どのような精神的なモデルによって車両は場所ですか? –

+0

私は同意します、車両は* Location *を持っているべきです - それは 'Location'データメンバーを含むべきです。それは全体の問題を取り除くだろう。 –

答えて

1

他の人の観察から始めて、場所を拡張しないでください。

Vehicle以外のものもMovableにするつもりですか?そうでなければ、Vehicleのいくつかの具体的なサブクラスを作成するだけです。MovableVehicleに簡単に変更します。抽象クラスAbstractVehicleに基本Vehicleの実装を持たせたい場合は、そうすることができます。次に、すべての車種をVehicle(またはAbstractVehicle)の具体的な実装にするだけです。

また、C + +でのあなたの質問のタイトルと経験では、Javaで一般的に見られるようなC++の慣用句について考えているかもしれません。コピーコンストラクタは、可能ではあるがJavaで作成されることもありますが、Javaでは普通のイディオムではありません。特に、私はそれがあなたがLocationのために作成することが奇妙であることがわかります。既存の場所の正確な複製を作成することによって、実際にどのくらいの頻度で問題を解決したいのですか?たぶんあなたは念頭に置いてユースケースを持っているかもしれませんが、それがなぜ役立つのか必要なのかが私には分かりません。場所は不変でなければならず、場所が変わったときに車両は新しい場所を取得する必要があります。

+0

私はAbstractVehicleという名前の新しい抽象クラスを作成し、すべての車両の抽象メソッドを含んでいます。このクラスは場所です。 これはあなたが言っていることですか? –

+0

はい、これはより受け入れられる設計になります –

0

安全な公開が必要な場合は、Locationimmutableとしてください。

はまた、VehicleLocationを拡張することによって、あなたは、車両が右鳴らない場所、であることを言っています。むしろ、車の位置を持っていますので、私はLocationフィールドとではないLocationを持つ車を作ることをお勧めします。

+0

車を移動できるので、場所を変更することができます –

+0

@RamyAlZuhouri 'Location'を不変にすることは、車両の位置を変更できないことを意味するものではなく、変更する代わりに*新しい*場所を作るだけです。 'String'は不変で、String変数を右に再割り当てしましたか?同じこと。 – Bohemian

0

Movableクラス内でsetメソッドとget locationメソッドを使用できますが、これら2つの関数はVehicleクラス内でLocationを拡張する利点を無効にします。私の推奨は、Locationをまったく拡張しないことですが、変数として保持してください。

public class Vehicle implements Movable { 
    ... 
    private Location myLocation; 
    ... 
} 

これは、前と同じ機能を提供するが、車両の位置を有している、ではない位置であり、位置は、車両自体を変更することなく自由に変更することができるという考えを適用すべきです。