2016-04-22 61 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功能處理聲音的通用方法。我希望這給你正確的觀點來使用抽象。

相關問題