来自超类字段的Java继承

时间:2012-09-15 16:00:05

标签: 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 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()时,我会查看错误的指针吗?

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

3 个答案:

答案 0 :(得分:4)

如果您这样做,您将hiding超级myPos的{​​{1}}字段。例如:

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字段,Unit 总是返回getPosition(),因为它会返回超类中的null字段,该字段从未设置过。

此外,如果您想确定两个myPos对象是否相同,请确保实施Position(以及.equals())。

答案 1 :(得分:1)

要确保您正在查看正确的位置,请通过super constructor

设置位置
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测试等效性,而不是检查它们是否是同一个对象。< / p>

答案 2 :(得分:0)

首先,方法getPosition()必须返回一些内容。在您的代码中它不返回任何内容,因为您已使用返回类型void

指定了该方法

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

通常testUnit.getPosition()new Position(..)不会返回相同的对象(尽管它们可能包含相同的值),从而使断言成为错误。