gpt4 book ai didi

java - 继承时clone方法、复制构造函数和getter方法的混淆

转载 作者:太空宇宙 更新时间:2023-11-04 08:21:12 25 4
gpt4 key购买 nike

我创建了一个位置类,如下所示:

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 + ")";
}
}

所以基于这个类,我想制作一个类vehicle,它继承自Location。但它还必须实现一个接口(interface)(我称之为 Movable),因为我想从 Vehicle 中创建其他类,然后公司(我的项目模拟 cargo 公司)可以使用车辆的 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,并使其成为克隆方法。另一种选择可能是使其成为复制构造函数而不是 getter 方法。务实地说,哪些选项是正确的?

最佳答案

从其他人的观察开始,不要扩展位置。

除了车辆之外,您是否打算让其他任何东西也成为可移动?如果不是,并且您只是要创建 Vehicle 的几个具体子类,那么我只需将 Movable 重命名为 Vehicle 即可。如果您想创建一个抽象类 AbstractVehicle 来实现基本的 Vehicle 实现,您可以这样做。然后,只需将所有车辆类型设为 Vehicle 的具体实现(或扩展 AbstractVehicle)即可。

此外,根据您的问题标题和 C++ 经验,您可能会考虑 C++ 习惯用法,而不是 Java 中常见的习惯用法。复制构造函数——尽管可能并且有时在 Java 中创建——并不是 Java 中的普通习惯用法。特别是,我发现您为位置创建一个很奇怪。您实际上多久会想要通过创建现有位置的精确副本来解决问题?也许您心里有一个用例,但我并没有很明显地明白为什么这样做是有帮助或必要的。位置应该是不可变的,当位置发生变化时,车辆应该获得新的位置。

关于java - 继承时clone方法、复制构造函数和getter方法的混淆,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9505649/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com