来自超类字段的Java继承
我用Java创建了这两个类,我需要这样定义我的结构:来自超类字段的Java继承,java,inheritance,Java,Inheritance,我用Java创建了这两个类,我需要这样定义我的结构: class UnitType { Position myPos; public Position getPosition() { return myPos; } } class Unit extends UnitType { Position myPos; public Unit(Position myPos) { this.myPos = myPos; } }
class UnitType {
Position myPos;
public Position getPosition() {
return myPos;
}
}
class Unit extends UnitType {
Position myPos;
public Unit(Position myPos) {
this.myPos = myPos;
}
}
我的问题是,我能做到以下几点吗
class UnitTest {
private Unit testUnit;
@Before
public void setUp() {
testUnit = new Unit(new Position(1,0));
}
@Test
public void testPositionUnit() {
assertEquals("Unit should be placed at (1,0)", new Position(1,0), testUnit.getPosition());
}
}
如果我能做到这一点,如果我更新了我的单元课的位置,会发生什么。调用getPosition()时是否会看到错误的指针
很多人都想知道我的Position类的.equals方法,所以这里就是:如果你这样做,你将成为超类UnitType
的myPos
字段。例如:
Unit u = new Unit(new Position(1, 0));
System.out.println(u.myPos); // (1, 0) assuming toString() was overriden
System.out.println(u.getPosition()); // null
UnitType ut = u;
System.out.println(ut.myPos); // null
然后,即使您可以更新Unit
类的myPos
字段,getPosition()
也将始终返回null
,因为它将从从未设置的超类返回myPos
字段
另外,如果要确定两个位置
对象是否相同,请确保实现.equals()
(和.hashCode()
)。如果这样做,您将成为超类单元类型
的myPos
字段。例如:
Unit u = new Unit(new Position(1, 0));
System.out.println(u.myPos); // (1, 0) assuming toString() was overriden
System.out.println(u.getPosition()); // null
UnitType ut = u;
System.out.println(ut.myPos); // null
然后,即使您可以更新Unit
类的myPos
字段,getPosition()
也将始终返回null
,因为它将从从未设置的超类返回myPos
字段
另外,如果要确定两个
Position
对象是否相同,请确保实现.equals()
(和.hashCode()
)。首先,方法getPosition()
必须返回一些内容。在代码中,它不返回任何内容,因为您已使用返回类型void
其次,根据您使用的Position
类(own class?、geometric Position?、…),您可能需要根据您想要实现的目标重写/编写equals(Object o)
方法
一般来说,
testUnit.getPosition()
和new Position(…)
不会返回相同的对象(尽管它们可能包含相同的值),因此断言是错误的。首先,方法getPosition()
必须返回一些内容。在代码中,它不返回任何内容,因为您已使用返回类型void
其次,根据您使用的Position
类(own class?、geometric Position?、…),您可能需要根据您想要实现的目标重写/编写equals(Object o)
方法
一般来说,
testUnit.getPosition()
和新位置(…)
不会返回相同的对象(尽管它们可能包含相同的值),因此使断言为假。要确保您看到的位置正确,请通过
然后,要使单元测试正常工作,请确保
位置
类重写equals(Object)
,以便assertEquals
将测试等价性,而不是检查它们是否是同一个对象。要确保查看的位置正确,请通过
然后,为了让单元测试正常工作,请确保
位置
类重写equals(Object)
,以便assertEquals
将测试等价性,而不是检查它们是否是同一个对象。您是否尝试过执行“以下操作”
?是否尝试过执行“以下操作”
?我可以传递内部指针吗?就像在超级构造函数中传递myPos并在Unit类中更新一样?然后在超类中,getPosition将指向单元中插入的位置。我可以传递内部指针吗?就像在超级构造函数中传递myPos并在Unit类中更新一样?然后在超类中,getPosition将指向单元中的位置insert。如果我不这样做,我将在单元实例中遇到更新,这将导致指向元素的指针不同。所以UnitType和Unit将有两个不同的myPos内部指针。@miniwolf,没有。只有一个myPos
字段。好的,但假设我想在UnitType内部而不是在UnitType内部更新此位置。@miniwolf,使字段受保护
,然后执行this.myPos=…
如果我执行此技巧,我不会在单元实例中遇到更新,这会导致指向元素的指针不同。所以UnitType和Unit将有两个不同的myPos内部指针。@miniwolf,没有。只有一个myPos
字段。好吧,但假设我想在UnitType内部而不是在UnitType内部更新此位置。@miniwolf,将字段设为受保护的,然后执行此操作。myPos=…
正是我的问题,因为将值从Unit构造函数解析到Super构造函数最初会给我相同的指针,但之后如果更新出现在Unit.myPos上,则会中断。不完全是这样<代码>新位置(..)
与堆中的testUnit.getPosition()
不是同一个对象实例。因此,Object
的equals()
方法(很可能会被使用)将返回false。这是我的Position类,.equals()方法应该解决这个问题。这正是我的问题,因为将值从Unit构造函数解析到Super构造函数最初会给我相同的指针,但之后如果更新出现在Unit.myPos上,则会中断。不完全如此<代码>新位置(..)
与堆中的testUnit.getPosition()
不是同一个对象实例。因此,Object
的equals()
方法(很可能会被使用)将返回false。这是我的Position类,.equals()方法应该解决这个问题。