簡體   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