【问题标题】:Custom Collections from generic to specific从通用到特定的自定义集合
【发布时间】:2012-03-27 22:38:30
【问题描述】:

我有以下通用自定义集合:

public class XList<Object> : List<Object>
{
    public XList() : base()
    {

    }
    public XList(Object[] values) : base(values)
    {

    }
    public void Add(XList<Object> inputObjects)
    {
        if (inputObjects == null) { return; }
        if (inputObjects.Count == 0) { return; }
        foreach (Object currentObject in inputObjects) { Add(currentObject); }
    }
}

我成功地使用了这个集合,它是具有多种数据类型的通用方法。例如:

XList<int>
XList<String>
XList<XFolder>

(XFolder 是一个引用文件夹的自定义类)

现在我想在上述类中嵌入一个特定于 XFolder 列表的方法。例如,一种从最长到最小路径对文件夹进行排序的方法。我是否必须创建一个新的自定义集合,还是可以在上面的类中创建,以便保留其通用属性/方法?

编辑:为了避免误解

@Matt Burland:我不是指异类收藏。异构集合是在同一个集合中存储不同数据类型的集合。我心目中的每个集合在同一个集合中存储相同类型的数据,但可以在不同的集合中存储不同类型的数据(相同类型,即XList)。

我的问题是我希望能够根据它们的类型为每个集合执行不同的方法:

整数集合应该有数学方法(例如将所有数字相加)

字符串集合应该有字符串方法(例如按字母顺序排序字符串)

食物的集合应该有适用于食物的方法(按食物类型分组)

我希望能够在我的主程序中执行以下操作:

XList<int> myNumberList = new XList<int>; myNumberList.Add(....//fill list with integers
XList<String> myStringList = new XList<String>; myStringList.Add(....//fill list with strings
XList<Food> myFoodList = new XList<Food>; myFoodList.Add(....//fill list with foods

int sumOfNumbers = myNumberList.sum();
myStringList.sort();
XList<Food> mySweetFoodList = myFoodList.getSweets();

在这个例子中,我所有的集合都是 XList 集合。但它们根据类型有不同的方法:

XList 有一个 sum() 方法

XList 有一个 sort() 方法

XList 有一个 getSweets() 方法

我不知道这是否可能。我什至不知道我的想法是否正确。目前我坚持使用 JaredPar 的答案并使用 XListExtension

【问题讨论】:

  • I have the following generic custom collection 通用? msdn.microsoft.com/en-us/library/512aeb7t(v=vs.80).aspx
  • 您可能希望使用Object 以外的其他名称来标识您的通用参数。也许TObject.
  • 是的,你应该使用泛型,如果你想对类型 T 有更多的可见性,请查看约束:msdn.microsoft.com/en-us/library/d5x73970.aspx
  • @GiorgioMinardi - 想提供一个例子来说明约束如何在这里提供帮助?
  • 所谓泛型是指它是一个对象列表,具体可以是 int、String 或其他对象类型。该类的方法适用于其中任何一个。但是,如果我想创建仅适用于特定对象类型的方法呢?

标签: c# collections


【解决方案1】:

如果该方法正在执行特定于XFolder 的操作,则它不应位于通用基类中。您应该满足以下条件之一:

您可以创建一个专门的类:

public class XFolderList : XList<XFolder>
{    
    // put your XFolder specific method here    
}

或者你可以创建一个扩展方法:

public static class XFolderExtensions
{    
    public static void SpecialXfolderMethod(this XList<XFolder> list)
    {
       // do special things here, change the return type if you need to
    }
}

【讨论】:

    【解决方案2】:

    如果你在 XFolder 上添加一个 IComparable,你可以让你的 XList 总是排序。或者,如果您不希望您的 XList 进行排序,则有一个始终排序的 XSortedList。这只解决了排序,所以如果你以后需要更多的添加,扩展方法或专门的类可能是要走的路。

    【讨论】:

      【解决方案3】:

      听起来您想为XList 实例使用特定的排序方法,这些实例使用XFolder 类型实例化。这是使用扩展方法的绝佳案例

      public static class XListExtensions { 
        public static SortFolders(this XList<XFolder> list) {
          // Do the sort
        }
      }
      

      我不会在这里使用继承来解决问题。排序方法并不代表一种新类型的对象,而是代表特定实例化的特殊行为。

      此外,我会完全避免从List&lt;T&gt; 派生。您显示的示例不会创建具有覆盖行为的新型列表。它只是在其之上添加了一些专业化方法。在此处选择扩展方法允许在所有 List&lt;T&gt; 值上使用该行为。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2016-05-03
        • 1970-01-01
        • 1970-01-01
        • 2012-07-10
        • 2010-12-05
        • 2019-10-25
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多