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
}

TRI 和 QUAD 类都有多个实例。这些包含在字典中,如下所示:

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

元素键(int 值)将与命名的 TRI/QUAD 字段等重合vertex1。我不知道元素类型类实例化时顶点的坐标。所以创建字典后,我需要循环遍历并从 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 个参数,我不知道这里是否应该使用接口或操作(委托)。

我是否因为使用“元素”字典值作为元素而让自己很难做到这一点?仅供参考,我的抽象类“元素”实际上是空白的,因为我不知道是否应该用字段填充它,因为派生类已经有字段。对此的任何评论也将不胜感激。

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

4

2 回答 2

1

为什么要 TRI 和 QUAD 继承 Element?正如你所说,Element是空的,这意味着TRI和QUAD没有任何共同的接口。如果您设法用 TRI 和 QUAD 填充该词典,您将如何使用该词典?拿一个项目,一个或另一个,到处都有“if”语句?您应该考虑如何使用它们。这将帮助您提取接口(如果有)。否则,我看不出为什么您应该尝试强制两种类型继承一种基本类型。您可能只使用两个字典Dictionary<int, TRI> and Dictionary<int, QUAD>

于 2013-03-20T03:21:38.787 回答
1

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

于 2013-03-20T04:33:42.673 回答