我有一个包含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字段重合,依此类推。在实例化Element-type类时,我不知道顶点的坐标。因此,在创建字典之后,我需要循环并从顶点字典中提取顶点数据并使用它来填充空白。
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”字典值作为元素而难以理解?仅供参考我的抽象类“元素”字面上是空白的,因为我不知道是否应该用字段填充它,因为派生类已经有字段。对此的任何评论也将受到赞赏。
创造更多词典总是有后盾;一个用于TRI,一个用于QUAD,然后在我使用简单方法填充顶点数据后将它们组合起来。但是我已经做到了这一点,我想学习一些关于接口和/或代理的实用方法。
答案 0 :(得分:1)
为什么要TRI和QUAD继承Element?正如你所说,Element是空的,这意味着TRI和QUAD没有任何通用接口。如果你设法用TRI和QUAD填充它,你将如何使用该字典?拿一个项目,把它一个或另一个投入,到处都有“if”语句?你应该考虑如何使用它们。这将帮助您提取界面,如果有的话。否则,我没有看到为什么你应该尝试强制两种类型继承一种基本类型。您可能只使用两个词典Dictionary<int, TRI> and Dictionary<int, QUAD>
。
答案 1 :(得分:1)
好吧,如果你考虑TRI和QUAD是如何相同的,它们都存储顶点的“列表”,除了TRI有三个,而QUAD有四个。不是只有两个具有不同数量的离散变量v1,v2,v3的类,为什么不只是包含一个包含Vertex对象数组的单个具体Element类?这可能允许您编写更容易处理顶点的代码。您不必担心是否有TRI或QUAD并调用不同的方法,您只需要查看数组的长度并循环多次。