x、y、z 座標を含む頂点クラスがあります。このクラスには、次の辞書に含まれる複数のインスタンスがあります。
// Vertex Collection
var Vertexs = new Dictionary<int, Vertex>();
public class Vertex
{
public double x, y, z;
}
次のように、さらに3つのクラスがあります。
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
}
TRI クラスと QUAD クラスの両方のインスタンスが複数あります。これらは、次のように辞書に含まれています。
// Element Collection
var Elements = new Dictionary<int, Element>();
要素キー (int 値) は、名前が付けられた TRI/QUAD フィールドなどと一致しvertex1
ます。要素型クラスのインスタンス化時の頂点の座標がわかりません。したがって、ディクショナリが作成された後、頂点ディクショナリから頂点データをループしてプルし、それを使用して空白を埋める必要があります。
foreach (var Elm in Elements)
{
// this is where I need help.
}
QUAD 要素は Vertexs ディクショナリから 4 つの頂点を取得する必要があり、TRI 要素は 3 つの頂点を取得する必要があります。したがって、私の 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 関数も呼び出す必要があることですが、入力が 3 つではなく 4 つになります。
私はインターフェイスとすべてのデリゲート型の経験がほとんどないため (私には役立たない単純な本の例のみ)、どのように進めればよいかわかりません。3 つの引数と 4 つの引数を取る関数「fetch_vertex_coords」が必要ですが、ここでインターフェイスまたはアクション (デリゲート) を使用する必要があるかどうかわかりません。
「要素」辞書の値を要素として使用することで、自分自身でこれを難しくしていますか? 参考までに、派生クラスには既にフィールドがあるため、フィールドを入力する必要があるかどうかがわからないため、抽象クラス「要素」は文字通り空白です。これに関するコメントもいただければ幸いです。
より多くの辞書を作成するというフォールバックが常にあります。1 つは TRI 用、もう 1 つは QUAD 用で、単純な方法を使用して頂点データを入力した後でそれらを結合します。しかし、私はここまで来て、インターフェイスやデリゲートについて実用的なことを学びたいと思っています。