操作或接口从集合填充类数据

本文关键字:填充 数据 集合 接口 操作 | 更新日期: 2023-09-27 18:05:03

我有一个顶点类,它包含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
}

有TRI和QUAD类的多个实例。它们包含在字典中如下:

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

Elements Key (int value)将与名为vertex1等的TRI/QUAD字段重合。我不知道实例化元素类型类时顶点的坐标。因此,在创建字典之后,我需要循环并从vertex字典中提取顶点数据,并用它来填补空白。

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

QUAD元素需要从Vertexs字典中拉出四个顶点,TRI元素需要拉出三个。所以我的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继承Element?正如你所说,Element是空的,这意味着TRI和QUAD没有任何公共接口。如果你设法用tri和quad填充这个字典,你将如何使用它?取一个项目,将其转换为一个或另一个,并到处使用"if"语句?你应该考虑如何使用它们。这将帮助您提取接口(如果有的话)。否则,我不明白为什么要强迫两个类型继承一个基类型。您可以只使用两个字典Dictionary<int, TRI> and Dictionary<int, QUAD>

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