繁体   English   中英

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

[英]Can I use a generic collection in an abstract base class property?

试图找出使用泛型的.NET等效项(放弃使用Java已有数年)。 这是我想要的一些伪代码:

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

然后,我有两个从myBase继承的类,每个类将实现2个属性,并且集合内的对象类型将有所不同。

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

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

关键是允许将这些项目绑定到TreeView,后者要求所有子元素具有相同的属性名称(用于xaml绑定)。 如果必须创建具有公共类型的新集合,则必须遍历每个集合,而且它们很大。 我不控制原始收集数据,因此无法修改这些类。

听起来您想要通用的基类:

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>而不必具有定义的子类型。

我同意斯坦利。 仅仅因为您可以创建一个抽象类并不意味着您应该这样做。 这是您确实需要抽象类的情况:

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

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的强大功能来处理声音的通用方法。 我希望这为您提供了使用抽象的正确视角。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM