我有以下通用自定义集合:
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
答案 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,它总是排序。这只能解决排序问题,所以如果将来需要更多的添加,可以选择扩展方法或专门的类。