2013-03-20 57 views
1

我有一個包含x,y,z座標的頂點類。這個類具有包含在以下詞典多個實例:從集合中填充類數據的動作或接口

// Vertex Collection 
var Vertexs = new Dictionary<int, Vertex>(); 

public class Vertex 
{ 
    public double x, y, z; 
} 

我有三個類,如下所示:

public abstract class Element 
{ } 

public class TRI : Element 
{ 
    public int vertex1, vertex2, vertex3; 
    public double v1x, v1y, v1z; 
    // and so on for vertex 2 & 3 
} 

public class QUAD : Element 
{ 
    public int vertex1, vertex2, vertex3, vertex4; 
    public double v1x, v1y, v1z; 
    // and so on for vertex 2, 3 & 4 
} 

有兩個三和四類的多個實例。這些都包含在一個字典如下:

// Element Collection 
var Elements = new Dictionary<int, Element>(); 

元素密鑰(int值)將與命名vertex1等的TRI/QUAD字段一致。在實例化Element類型的類時,我不知道頂點的座標。所以在創建字典之後,我需要循環並從頂點字典中提取頂點數據並用它填充空格。

foreach (var Elm in Elements) 
{ 
    // this is where I need help. 
} 

四元素需要從Vertexs詞典拉四個頂點和三元素需要拉三人。所以我的TRI功能應該看起來像這樣。

public void fetch_vertex_coords(Vertex vertex1, Vertex vertex3, Vertex vertex3) 
{ 
    v1x = vertex1.x; v1y = vertex1.y; v1z = vertex1.z; 
    v2x = vertex2.x; v2y = vertex2.y; v2z = vertex2.z; 
    v3x = vertex3.x; v3y = vertex3.y; v3z = vertex3.z; 
} 

的問題是,QUAD需要調用void函數爲好,但將有4個輸入,而不是三個。我對接口和所有委託類型的經驗都很少(只有簡單的書本例子不能幫助我),所以我並不真正知道如何繼續。我需要一個函數「fetch_vertex_coords」,它需要3個參數,一個需要4個參數,我不知道這裏是否應該使用接口或動作(委託)。

我是否在使用「元素」字典值作爲元素時很費力?僅供參考我的抽象類「元素」字面上是空白的,因爲我不知道是否應該填充字段,因爲派生類已經有字段。對此的任何評論也將不勝感激。

創建更多字典總是存在回退;一個用於TRI,另一個用於QUAD,然後在我使用簡單的方法填充頂點數據後再組合它們。但是我已經得到了這麼多,我想了解一些關於接口和/或代表的實際操作。

回答

1

爲什麼要讓TRI和QUAD繼承Element?正如你所說,元素是空的,這意味着TRI和QUAD沒有任何通用接口。如果您設法使用TRI和QUAD填充它,您將如何使用該字典?拿一個項目,把它一個或另一個,並在所有地方都有「if」聲明?你應該考慮如何使用它們。如果有的話,這將有助於你提取界面。否則,我不明白爲什麼你應該試圖強制兩種類型繼承一種基本類型。您可能只需使用兩個詞典Dictionary<int, TRI> and Dictionary<int, QUAD>

+0

該程序將顯示圖形。稍後在我的gameLoop中,我將繪製繪製TRI和QUAD元素的函數。我想盡可能保持緊湊,所以... TRI和QUAD從Element繼承,這樣我就可以將它們組合成單個字典。這樣,我只有一個字典可以循環更新環境。您提到我必須以各種方式投射每個項目......我認爲無論是界面還是操作都可以決定使用哪種方法(3個vertex或4個或更多)。我現在想要棄用多個Dict,因爲我實際上有> 10個。 – Todd 2013-03-20 03:35:06

1

好吧,如果你想TRI和QUAD他們如何同頂點,他們都店「名單」,除了TRI有三個,而QUAD有四個。爲什麼不只有一個包含Vertex對象數組的具體Element類,而不是具有不同數量的離散變量v1,v2,v3的兩個類?這可能允許您編寫更容易處理頂點的代碼。您不必擔心是否有TRI或QUAD並調用不同的方法,您只需查看數組的長度並多次循環即可。

+0

這是一個有趣的解決方案,然而,我的派生類有許多特定於該形狀的方法,因此單個組在修復其他組時會產生問題。也許我需要將整個元素字典傳遞給方法,然後遍歷頂點字段。我可以把它們放在你提到的列表中。我可以將整個字典傳遞給一個方法嗎,這可能/實際嗎? – Todd 2013-03-20 16:24:51

+0

是的,你絕對可以通過一個字典的方法。這是一個像其他任何東西一樣的對象。 – 2013-03-20 19:52:28

+0

傳遞整個字典是否帶有性能損失?我認爲答案是否定的,因爲它是通過參考傳遞的,但我只是想對它提出客觀的意見。 – Todd 2013-03-20 20:01:09