0

これら 2 つのクラスを 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

そうすると、スーパークラスのフィールドが非表示になります。例えば:myPosUnitType

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()nullmyPos

また、2つのPositionオブジェクトが同じであるかどうかを判断する場合は、必ず.equals()(および.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()に、 andnew Position(..)は同じオブジェクトを返さないため (同じ値が含まれている可能性があります)、アサーションが false になります。

于 2012-09-15T16:19:56.613 に答える