2012-03-04 58 views
2

我已經做了類AbstractVehicle:AbstractVehicle使用時間作爲類成員

package TruckingCompany; 

public abstract class AbstractVehicle implements Movable 
{ 
public Location location; 
public Time time; 
double direction; 
public final int speed; 
public AbstractVehicle(int speed) 
{ 
    if(speed<=0) 
     speed=10; 
    this.speed=speed; 
} 
public int getSpeed() 
{ 
    return speed; 
} 
public void setLocation(Location location) 
{ 
    this.location=location; 
} 
public void setTime(Time time) 
{ 
    this.time=time; 
} 
public Location getLocation() 
{ 
    return location; 
} 
public Time getTime() 
{ 
    return time; 
} 
public void pointTo(Location where) 
{ 
    direction=location.getDirectionFrom(where); 
} 
public void move(Time until) 
{ 
    double dx,dy; 
    int howLong; 
    howLong=time.compareTo(until); 
    dx=Math.sin(direction)*howLong/60; 
    dy=Math.cos(direction)*howLong/60; 
    if(howLong>0) 
    { 
     time=new Time(until); 
     location=new Location(location.getX()+dx,location.getY()+dy); 
    } 
} 
public void move(double howFar) 
{ 
    double dx,dy; 
    dx=Math.sin(direction)*howFar; 
    dy=Math.cos(direction)*howFar; 
    location=new Location(location.getX()+dx,location.getY()+dy); 
} 
} 

這是接口可移動:

package TruckingCompany; 

public interface Movable 
{ 
public int getSpeed(); 
public void setLocation(Location location); 
public void setTime(Time time); 
public Location getLocation(); 
public Time getTime(); 
public void pointTo(Location where); 
public void move(Time until); 
public void move(double howFar); 
} 

這是Java和其它OOP語言對我來說是恆定的問題像C++一樣。
的問題是:

  • 是正確的,使類AbstractVehicle具有類型時間的對象?
  • 它能從時間繼承嗎?

在像C這樣的過程式編程中,我可以編寫一個程序,所有我不得不擔心的是有效性,以及使他工作的acode。
但是這種情況下也存在概念錯誤,所以有一條規則要知道我在做什麼從概念上說是對的?因此,例如有人可能會說車輛不應該有一個時間對象,因爲所有的車輛不能有不同的時間。
但我沒有得到標準:什麼時候放置HAVE關係而不是繼承,什麼時候不使用HAVE關係,只是修改該字段的父類。
這種情況下,車輛不能有時間類型的對象,並可能只有一個方法move(double howLong)表明它必須移動的分鐘。我也可以這樣做。 但是爲什麼?選擇什麼標準?

+0

當你看一輛車時,什麼是*時間*?你的車**有一個**時間,但是,老實說,我不知道它是什麼(某種時間)。 – 2012-03-04 13:00:50

+0

這是我做的一個類:http://pastebin.com/XN0xvFjh – 2012-03-04 13:48:14

回答

2

您不應該從Time繼承。你的班級AbstractVehicle不是Time,它使用它。您不希望允許在AbstractVehicle中提供Time的所有行爲。

所以你決定讓AbstractVehicleTime是一個不錯的選擇。

1

是否正確使AbstractVehicle類具有Time類型的對象?

絕對。這被稱爲通過構圖來提升你的課堂,並被鼓勵。

它能繼承嗎?

絕對不是因爲時間和車輛未能通過「是 - 一個」測試 - 車輛本身並不是一種更專門化的時間類型,因爲狗是一種更專門的動物類型。另一方面,您可以允許程序員通過給類設置一個setTime(Time t)「setter方法」(因爲您的AbstractVehicle類已​​經使用)來使用Time的更多特殊子類。這被稱爲「依賴注入」,也是一件好事。

但我過不了標準:當把HAVE關係而不是繼承,或者在都有着關係,只是corrdinate那場弗羅姆xternal類不使用。 這種情況下,車輛不能有Time類型的對象,並且可能只有一個方法移動(double howLong),表示它必須移動的分鐘數。我也可以這樣做。但爲什麼?選擇什麼標準?

我不完全理解這部分的問題。如果別人不能很快解決它,你能澄清一點嗎?

+0

我的意思是說,我沒有得到如何決定從一個類繼承,使用該類還是什麼都不做的標準。例如,我可以繼承形式時間,使用時間,或者不要放任何東西。 – 2012-03-04 13:45:36

1

你需要記住的規則並不多。通過查看精心設計的課程的好例子,並通過對其設計進行批評,您將學習如何面向對象設計(OOD)。

你的課程在這裏建模一個真實的東西。所以,時間是車輛的財產。我對此表示懷疑。除非你的意思是timeInService或timeTraveling(等等,那意味着別的東西!)。如果時間指的是某個時鐘,那麼它就是整個程序的屬性,可能是客戶端系統,但不是車輛。

AbstractVehicle的字段是您需要建模的屬性。你的車輛是否總是以恆定的速度行駛,並且它們從不停下來?如果不是,那麼速度不應該是最終的。也許你可以有一個最終速度的maxSpeed,但我認爲速度可能會改變。

+0

我想像的時間就像車輛的內部時鐘,速度是maxSpeed(我會改名字)。 車輛只能以該速度行駛,或者保持在固定位置。 – 2012-03-04 13:26:36