自定义集合从通用到特定

时间:2012-03-11 01:28:52

标签: c# collections

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

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

3 个答案:

答案 0 :(得分:2)

如果方法正在执行特定于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
    }
}

答案 1 :(得分:1)

听起来您希望为使用XList类型实例化的XFolder实例设置特定的排序方法。这是使用扩展方法的一个很好的例子

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

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

另外,我会避免在这里完全从List<T>派生。您显示的示例不会创建具有重写行为的新类型列表。它只是添加了一些专门化方法。在此处选择扩展方法允许在所有List<T>值上使用该行为。

答案 2 :(得分:0)

如果您在XFolder上添加IComparable,您可以让您的XList始终排序。或者,有一个XSortedList,如果你不想要你的XList,它总是排序。这只能解决排序问题,所以如果将来需要更多的添加,可以选择扩展方法或专门的类。