0

我在 Java 中创建了这两个类,我需要像这样定义我的结构:

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());
    }
}

如果我能做到这一点,如果我更新了我的 Unit 类中的位置会发生什么。调用 getPosition() 时会看到错误的指针吗?

许多人想知道我的 Position 类的 .equals 方法,所以这里是:https ://pastebin.com/Tfer1kqR

4

3 回答 3

4

如果这样做,您将隐藏超类的myPos字段UnitType。例如:

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

然后,即使您可以更新类的myPos字段UnitgetPosition()也将始终return null,因为它将返回myPos从未设置过的超类的字段。

此外,如果您想确定两个Position对象是否相同,请确保实现.equals()(and .hashCode())。

于 2012-09-15T16:02:22.030 回答
1

为确保您正在查看正确的位置,请通过超级构造函数设置位置

class UnitType {
    Position myPos;  // This could be private final.

    // Only needed for backwards compatibility if you do new UnitType().
    UnitType() { this(null); }  // this(...) delegates to another constructor.
    // sets the position field.
    UnitType(Position myPos) { this.myPos = myPos; }

    public void getPosition() {
        return myPos;
    }
}
class Unit extends UnitType {
    // No field definition here that masks the super-class one.
    public Unit(Position myPos) {
        super(myPos);  // Invoke UnitType(Position) to set the field
    }
}

然后让你的单元测试工作,确保Position类覆盖equals(Object),以便assertEquals测试等效性而不是检查它们是否是同一个对象。

于 2012-09-15T18:25:46.907 回答
0

首先,你的方法getPosition()必须返回一些东西。在您的代码中它不返回任何内容,因为您已经指定了具有返回类型的方法void

其次,根据Position您使用的类(自己的类?,几何位置?,...),您可能需要equals(Object o)根据您想要实现的目标覆盖/编写该方法。

一般来说testUnit.getPosition()new Position(..)不会返回相同的对象(尽管它们可能包含相同的值),从而使断言为假。

于 2012-09-15T16:19:56.613 回答