【问题标题】:OOP design and Lists and collections (C#)OOP 设计和列表和集合 (C#)
【发布时间】:2010-11-25 10:35:04
【问题描述】:

我需要设计一个简单的软件,我想知道最好的方法。

首先,对于新手问题很抱歉:使用列表的最佳方式是什么?我尝试了几次,并没有意识到实例化它们的正确方法以及如何在 OOP 中使用它们。谁能帮我解决一下?

第二个问题是:我有以下类(格式松散,不是代码)

Tenement:
tenementID Int32,
polygons Polygon, (here i need to use a list, but how?)
status TenementStatus;

Polygon:
polygonID Int32,
vertexes vertex (need to use a list here too),
areaPolygon;

Vertex:
vertexID Int32,
X Int32,
Y Int32;

我对这些课程的看法正确吗?有没有更简单的方法来做到这一点?

【问题讨论】:

  • 顶点看起来可能是一个结构而不是一个类。

标签: c# oop class list


【解决方案1】:

在 C# 中,List 只是一个数据结构,表示可以通过索引访问的对象集合。如果这句话是有道理的,那么您就几乎了解了您需要了解的有关列表的所有信息(至少对于此示例而言)。如果没有,您可以先查看 List(T) class 的 MSDN 文档。

例子:

// Declare a new list of vertices
List<Vertex> vertices = new List<Vertex>();

// Add a couple of vertices
vertices.Add(new Vertex(0, 0, 0));
vertices.Add(new Vertex(1, 100, 100));
vertices.Add(new Vertex(2, 50, 50));

// Get a vertex back out of the list by using its index
Vertex temp = vertices[1]; // this is the second vertex we added above

【讨论】:

  • 谢谢,您刚刚回答了我的问题。可以这样使用吗?多边形 poly = new Polygon(); poly.Vertices.Add(新顶点(0,0,0)); ?
  • 是的,只要 Polygon 类中的 Vertices 集合在您尝试访问的范围内可见。
【解决方案2】:

在 C# 中,您需要使用 List&lt;T&gt; 类来处理作为列表的集合。

例如:

public class Tenement
{
     public Tenement()
     {
         this.Polygons = new List<Polygon>(); // Create the list here...
     }
     public int Id { get; set; }
     public IList<Polygon> Polygons { get; private set; }
     // ...

编辑: 如果您需要控制如何添加或删除项目,例如检查以确保多边形有效,您也可以这样做:

public class Tenement
{
     public Tenement()
     {
         this.polygons = new List<Polygon>(); // Create the list here...
     }
     private List<Polygon> polygons;

     public int Id { get; set; }
     public IEnumerable<Polygon> Polygons { 
        get { return this.polygons; }
     }
     public void AddPolygon(Polygon polygon) {
         // Do extra stuff here, then:
         this.polygons.Add(polygon);
     }
     // ...

【讨论】:

  • @George:在这种情况下公开 set 是个坏主意,因为我们不希望班级以外的人“设置”我们的多边形。他们仍然可以这样做:myTenement.Polygons.Add(new Polygon()); --- 这是因为他们正在添加到您的现有列表中,而不是创建新列表。没有理由制作“AddPolygon()”方法,因为它们可以将其添加到您的列表中。
  • @George:话虽如此,有时您想控制如何将事物添加到列表中。我将编辑我的答案以包含详细信息。
  • @George:Reed 这样做的方式是在 .NET 中处理集合成员的标准推荐模式(对于其他语言/框架,可能会有所不同)。特别是:集合属性一般不应该是可设置的;因此,它们应该由类本身初始化(可能在构造函数中);并且类不应该有像AddPolygon() 这样的方法——客户端应该做Polygons.Add(...)。这都包含在框架设计指南中:参见msdn.microsoft.com/en-us/library/ms229042.aspx
  • 另外,本书更详细地介绍了这个问题和其他类似问题:amazon.com/Framework-Design-Guidelines-Conventions-Libraries/dp/…(由负责 Microsoft 本身的 .NET 类库样式指南的 Microsoft 人员编写)
  • 对 Reed 的第二个选项进行更多讨论,请注意,.Net 为不开放供客户端更改的列表属性提供了一个包装类型: public System.Collections.ObjectModel.ReadOnlyCollection Polygons {获取 { 返回新的 ReadOnlyCollection(this.polygons);这提供了比裸 IEnumerable 更丰富的语义,并防止客户端强制转换回 List 以绕过保护。
【解决方案3】:

如果您正在寻找一个简单的 List 对象...

List<Vertex> vertices = new List<Vertex>();

List<TenementStatus> statuses = new List<TenementStatus>();

这是满足您需求的简单声明...

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2010-10-16
    • 1970-01-01
    • 2011-02-22
    • 1970-01-01
    相关资源
    最近更新 更多