2014-10-27 98 views
-1

我正在嘗試在C#中製作遊戲。 首先看到一些到目前爲止我的代碼:同時將對象投射到抽象類和接口上

我的抽象類gridobject

它包含了我的gridobjects(牆,播放器,敵人,等等)的所有一般屬性

abstract class GridObject 
{ 
    public Rectangle Rect; 

    ... 
    //all kind of getters and setters for location and size: X, Y, Height, Width 
    ... 
} 

接口移動

此接口包含移動的網格對象的屬性:

interface Moving 
{ 
    int Xspeed { get; set; } 
    int Yspeed { get; set; } 
    void Move(); 
} 

現在我想重力添加到我的遊戲:

public void doGravity(GridObject obj) 
    { 
     //check if intersects && if object isn't the same as the given object. 
     while (AllGridObjects.FindAll(item => item.Rect.IntersectsWith(obj.Rect) && item != obj).Count > 0) 
     { 
      obj.Y += obj.Yspeed; 
      obj.Yspeed++; 
     } 
    } 

這ofcourse給出了一個編譯錯誤。因爲Yspeed不是抽象類GridObject中的必需字段。 也許標題不正確,也許也是我的問題,但是如何將對象投射到抽象類和界面以確保屬性Y和屬性Yspeed是必需的? 這樣做的正確方法是什麼?

+2

創建一個'Moving'類型的局部變量?注意:.net約定爲接口使用'I'前綴,它應該是'IMoving'而不是'Moving'。 – 2014-10-27 13:49:18

+0

如果我使用兩個變量,我的代碼是否仍然運行得足夠快?並感謝您的提示! – 2014-10-27 13:54:44

+0

當然,試試吧。確保你沒有在循環中進行投射。讓「IMoving」本地在循環之外。 – 2014-10-27 13:57:58

回答

0

感謝DLeh我找到了解決方案。 我正在使用從GridObjectMoving繼承的額外抽象類MovingGridObject。 這是我打算在我的doGravity方法中使用的類型。

1

在設置值之前將其轉換爲您需要的類型。

if(obj is Moving) 
{ 
    var objectAsMoving = obj as Moving; //or (Moving)obj; 
    objectAsMoving.Y += objectAsMoving.Yspeed; 
    objectAsMoving.Yspeed++; 
} 
+0

當我這樣做時,我的程序給objectAsMoving.Y編譯錯誤,因爲它是gridobject的屬性。 – 2014-10-27 13:53:13

+0

如果需要,您需要設置一些方法在這些對象之間進行轉換。創建一個繼承自'GameObject'和'Moving'的類並將其稱爲'MoveableGameObject'或其他東西,然後將其轉換爲來自'GameObject'的類。 – DLeh 2014-10-27 13:55:51

+0

謝謝!這是我一直在尋找的解決方案 – 2014-10-27 13:57:37