1

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 用で、単純な方法を使用して頂点データを入力した後でそれらを結合します。しかし、私はここまで来て、インターフェイスやデリゲートについて実用的なことを学びたいと思っています。

4

2 に答える 2

1

TRI と QUAD に Element を継承させたい理由は何ですか? あなたが言ったように、Element は空です。つまり、TRI と QUAD には共通のインターフェイスがありません。TRI と QUAD を辞書に入力できたら、その辞書をどのように使用しますか? 1 つのアイテムを取り、それをキャストして、どこにでも "if" ステートメントを配置しますか? それらがどのように使用されるかを考えなければなりません。インターフェースがある場合は、それを抽出するのに役立ちます。そうでなければ、2 つの型に 1 つの基本型を強制的に継承させようとする理由がわかりません。2 つの辞書を使用することもできますDictionary<int, TRI> and Dictionary<int, QUAD>

于 2013-03-20T03:21:38.787 に答える
1

TRI と QUAD がどのように同じかを考えると、TRI には 3 つ、QUAD には 4 つあることを除いて、どちらも頂点の「リスト」を格納します。離散変数 v1、v2、v3 の数が異なる 2 つのクラスを持つ代わりに、Vertex オブジェクトの配列を含む単一の具体的な Element クラスを持たないのはなぜでしょうか? これにより、頂点をより簡単に処理するコードを記述できるようになる場合があります。TRI と QUAD のどちらを使用しているかを気にして、さまざまなメソッドを呼び出す必要はありません。配列の長さを調べて、何度もループするだけで済みます。

于 2013-03-20T04:33:42.673 に答える