2016-04-22 74 views
0

试图找出使用泛型的.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; 

的关键是让这些项目被绑定到,要求所有的子元素具有相同的属性名称(XAML绑定)一个TreeView。如果我必须创建一个通用类型的新集合,我将不得不迭代遍历每个集合,并且它们很大。我不控制原始收集数据,所以我无法修改这些类。

+4

而不是编写伪代码,你可以尝试写一个[mcve]吗?在我看来,你基本上需要MyBase是通用的,然后创建一个'MyBase '和一个'MyBase ' - 目前尚不清楚你是否需要这两个子类。 –

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

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功能处理声音的通用方法。我希望这给你正确的观点来使用抽象。

相关问题