首先,我不知道標題是否反映了我的問題。如果你有更好的想法,我表示歉意,並請求改變。設計:在超類中的字段的子類中引用
現在,我遇到的問題主要是設計問題。我不確定我想要的是不錯的做法,但它很方便。
我有一個接口叫做IMovement。
兩個類實現IMovement:VelocityMovement,SplineMovement。
我也有一個類叫做雪碧。雪碧有一個IMovement。
最後,我有兩個雪碧sublcasses:玩家和敵人。
我知道是球員將總是有VelocityMovement和
我知道是敵人將總是有SplineMovement。
除了超類參考IMovement之外,是否有錯誤(無論是通過設計還是實踐),都有分別來自Player或Enemy的VelocityMovement或SplineMovement屬性?
換句話說:
Interface IMovement {
public Vector2 getPosition(int time);
}
class VeloctiyMovement implements IMovement {
public Vector2 velocity;
public Vector2 getPosition(int time) { ... }
}
class SplineMovement implements IMovement {
public Spline spline;
public Vector2 getPosition(int time) { ... }
}
class Sprite {
IMovement movement;
}
class Player extends Sprite {
public VelocityMovement velocityMovement;
public Player() {
velocityMovement = new VelocityMovement();
movement = velocityMovement;
}
}
class Enemy extends Sprite {
public SplineMovement splineMovement;
public Enemy() {
splineMovement = new SplineMovement();
movement = splineMovement();
}
}
我想在子類中的引用是方便的原因。有一半時間我需要玩家的速度場,另外一半時間我不在乎。這發生在一個遊戲中,該方法每秒被調用大約100次。
我指出100次的原因是因爲我也擔心鑄造是否昂貴。
實例代替,:
// When I need the velocity
Vector2 velocity = ((VelocityMovement)player.movement).velocity;
...
// When I don't care
Vector2 position = player.movement.GetPosition(time);
...
我現在可以這樣做:
Vector2 velocity = player.VelocityMovement.velocity;
...
Vector2 position = player.movement.GetPosition(time);
...
所以我的問題是:如果球員有VelocityMovement場和敵人有SplineMovement?或者這是一個糟糕的設計?
我想你的想法。
UPDATE
我現在還記得我爲什麼選擇具有的而不是雪碧實現IMovement(如JacobM正確建議)字段IMovement。
這是因爲在某些情況下,Enemy可能有SplineMovement和其他VelocityMovement。雖然我錯誤地說「我知道敵人總是會有SplineMovement」,但我應該說,我知道一個敵人在VelocityMovements收集所有敵人的地方有VelocityMovement。我希望你能理解我(否則我覺得自己像個白癡)。
例如:
List<Enemy> enemies = GetAllVelocityMovementEnemies();
我這樣做是因爲地方在我的遊戲邏輯,我想隻影響組具有VelocityMovements敵人。
所以,儘管JacobM的答案作爲設計是完全有效的,但這不適合我的情況。否則,我必須將Enemy與EnemyVelocityMovement和EnemySplineMovement等子類化,等等。
所以,很抱歉誤會,我決定Brian Agnew's答案是我設計的最佳答案。
哦,是的,關於鑄造的爭執實在是不成熟的優化。 ;)
如果您根據語言對其進行標記,可能會有所幫助。 – Beta 2009-10-29 18:58:01
雖然我主要關心這個設計,但是如果它有幫助的話,那就是C#(但也可能是Java) – pek 2009-10-29 19:04:48