我可以在抽象基类属性中使用泛型集合吗?

时间:2016-04-22 16:31:10

标签: c# generics

尝试使用泛型来计算.NET等价物(已经使用Java几年了)。这里有一些我想要的伪代码:

abstract base class MyBase
abstract property string Name;
abstract property ObservableCollection<T> SubItems;

然后我有2个继承自myBase的类,每个类都会实现2个属性,集合中的对象类型也会不同。

class Real1 : MyBase
    property string Name 
    property ObservableCollection<SomeClass> SubItems;

class Real2 : MyBase
    property string Name 
    property ObservableCollection<SomeDifferentClass> SubItems;

重点是允许将这些项绑定到TreeView,该TreeView要求所有子元素具有相同的属性名称(对于xaml绑定)。如果我必须创建一个具有通用类型的新集合,我将不得不遍历每个集合并且它们很大。我不控制原始的集合数据,因此我无法修改这些类。

2 个答案:

答案 0 :(得分:3)

听起来你想要一个通用的基类:

abstract class MyBase<T>
{
    public abstract string Name {get; set;}
    public abstract ObservableCollection<T> SubItems {get; set;}
}

class Real1 : MyBase<SomeClass>
{
       public override string Name  {get; set;}
       public override ObservableCollection<SomeClass> SubItems {get; set;}
}

class Real2 : MyBase<SomeDifferentClass>
{
       public override string Name {get; set;}
       public override ObservableCollection<SomeDifferentClass> SubItems  {get; set;}
}

但除非属性的实现不同,否则我不明白为什么你需要一个抽象基类,并且不清楚为什么你需要子类。您可以创建MyBase<SomeClass>,而无需定义子类型。

答案 1 :(得分:0)

我同意斯坦利的观点。仅仅因为你可以创建一个抽象类并不意味着你应该这样做。这是您需要抽象类的场景:

假设您正在静态类中创建一个方法来处理动物声音并执行某些操作,例如

public static class AnimalHelper {
    public static string NotifySound(this Animal animal) {
        return animal. GetType().Name + " "  + animal.Sound.ToString() + "s";
    }
}

现在,你不知道你的动物及它的SoundType。所以你创建了一个抽象类:

public abstract class Animal {
    public abstract SoundType Sound{get;}
}

public enum SoundType{
    Bark,
    Roar,
    Meow
}    

public class Dog:Animal {
    public override SoundType Sound { get { return SoundType.Bark; } }
}

public class Lion:Animal {
    public override SoundType Sound { get { return SoundType.Roar; } }
}

所以在这里你已经创建了使用OOP处理声音的通用方法。我希望这给你正确的视角来使用抽象。