我有一個基類作爲這樣一個不變的基礎:創建通用的方法
public abstract class BasePiece extends Serialisable {
public final Position[] shape;
public final Position position;
public abstract Position[] getInitialShape();
public BasePiece() {
position = new Position(0, 0);
shape = getInitialShape();
}
public BasePiece(Position pos, Position[] initialShape) {
position = pos;
shape = initialShape;
}
public BasePiece Moved(Position offset) {
return BasePiece(position.add(offset), shape);
}
public BasePiece Rotated() {
return BasePiece(position, shape.Rotated());
}
}
不過,我想移動和旋轉回到它繼承這個類的類的實例。我對Java很陌生,並且有一些C#的經驗,我試圖做到以下幾點:
public <T extends BasePiece> T Moved(Position offset) {
return T(position.add(offset), shape);
}
public <T extends BasePiece> T Rotated() {
return T(position, shape.Rotated());
}
有沒有什麼辦法做到這一點?我最初嘗試解決這個問題的方法是讓形狀和位置不再是最終的,並且使Moved和Rotate Move和Rotate方法改變這個狀態。我真的想使對象不可變,因爲它會使我的應用程序的其餘部分更易於管理。
編輯說明:Serializable是一個接口。你的抽象基類需要實現它,而不是擴展它,所以你會得到該行的編譯錯誤。我懷疑你已經知道了,這只是一個錯字。 –
另外,你正在調用一個方法'旋轉()'離開數組,但是一個數組沒有任何這樣的方法。編譯器會給你一個'symbol not found'錯誤。 –
嘎對不起,我試圖簡化我的例子有點太多,我其實有一個類定義在這裏有一個旋轉的方法,你正確的實現/延伸 – theheadofabroom