我做了一个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);
}
}
这是Movable接口:
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这样的过程式编程中,我可以编写一个程序,而我只需要担心效率和一个能使他工作的代码。
但是这种情况下也存在概念错误,因此有一条规则可以知道我在做什么在概念上是正确的?例如,某人可能会说某辆车不应有时间对象,因为所有车不能有不同的时间。
但是我无法获得标准:什么时候放置HAVE关系而不是继承,或者什么时候根本不使用HAVE关系,而只是从外部类中确认该字段。
这种情况下,Vehicle不能有Time类型的对象,而只能有一种方法
move(double howLong)
指示必须移动的分钟数,我也可以这样做。但为什么?选择什么标准?
最佳答案
您不应该从Time
继承。您的课程AbstractVehicle
不是Time
,它使用它。您不想允许Time
的所有行为在AbstractVehicle
中可用。
因此,使AbstractVehicle
拥有Time
的决定是一个不错的决定。