C# 用于从集合填充类数据的操作或接口

C# 用于从集合填充类数据的操作或接口,c#,dictionary,interface,delegates,action,C#,Dictionary,Interface,Delegates,Action,我有一个顶点类,它包含x,y,z坐标。此类具有多个实例,这些实例包含在以下词典中: // Vertex Collection var Vertexs = new Dictionary<int, Vertex>(); public class Vertex { public double x, y, z; } TRI和QUAD类都有多个实例。这些内容包含在字典中,如下所示: public abstract class Element { } public class TR

我有一个顶点类,它包含x,y,z坐标。此类具有多个实例,这些实例包含在以下词典中:

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

public class Vertex
{
    public double x, y, z;
}
TRI和QUAD类都有多个实例。这些内容包含在字典中,如下所示:

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>();
四元元素需要从顶点字典中提取四个顶点,三元元素需要提取三个顶点。所以我的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个输入,而不是3个

我对接口和所有委托类型都没有什么经验(只有简单的书籍示例对我没有帮助),所以我真的不知道如何继续。我需要一个函数“fetch_vertex_coords”,它将有3个参数,一个参数将有4个参数,我不知道这里是否应该使用接口或操作(委托)

我是否因为使用“Elements”字典值作为元素而对自己施加了压力?仅供参考,我的抽象类“Element”实际上是空的,因为我不知道是否应该用字段填充它,因为派生类已经有字段了。如对此有任何评论,我们将不胜感激


创造更多的词典总是有退路的;一个用于TRI,一个用于QUAD,然后在我使用简单的方法填充顶点数据后将它们组合起来。但我已经走了这么远,我想学习一些关于接口和/或委托的实用知识。

为什么希望TRI和QUAD继承元素?正如您所说,元素是空的,这意味着TRI和QUAD没有任何公共接口。如果你用三元组和四元组来填充字典,你将如何使用它?拿一个项目,投一个或另一个,并有“如果”语句无处不在?你应该考虑如何使用它们。这将帮助您提取接口(如果有)。否则,我看不出有什么必要强制两个类型继承一个基类型。您可以只使用两个字典
Dictionary和Dictionary

如果您想一想TRI和QUAD是如何相同的,它们都存储顶点的“列表”,除了TRI有三个而QUAD有四个。与其有两个具有不同数量离散变量v1、v2、v3的类,为什么不只拥有一个包含顶点对象数组的具体元素类呢?这可能允许您编写更容易处理顶点的代码。您不必担心是否使用TRI或QUAD并调用不同的方法,只需多次查看数组和循环的长度。

程序将显示图形。稍后在我的gameLoop中,我将拥有绘制三元和四元元素的绘制函数。我想让它尽可能紧凑,这样。。。TRI和QUAD继承自元素,因此我可以将它们合并到单个字典中。这样,在更新环境时,我只有一个字典可以循环使用。你提到我必须以这样或那样的方式投射每件物品。。。我认为一个接口或操作可以决定使用哪种方法(3个vertx或4个或更多)。我现在不想使用多个Dict,因为实际上我的Dict大于10。这是一个有趣的解决方案,但是,我的派生类有许多特定于该形状的方法,因此单个组在修复其他组时会产生问题。也许我需要将整个元素字典传递给该方法,然后循环遍历顶点字段。我可以像你提到的那样把它们列在一个清单上。我能把一整本字典传给一个方法吗?这可行吗?是的,你绝对能把一本字典传给一个方法。它是一个和其他任何对象一样的对象。通过整个字典会带来性能损失吗?我认为答案是否定的,因为它是通过引用而通过的,但我只是想对它有一个客观的看法。不,没有表现惩罚。通过引用传递它是正确的。
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;
}