我做了一个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的决定是一个不错的决定。

10-05 18:22