简体   繁体   中英

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

Trying to figure out the .NET equivalent using generics (been away doing Java for several years). Here's some pseudo code for what I want:

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

Then I have 2 classes that inherit from myBase each would implement the 2 properties and the types of objects inside the collection would e different.

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

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

The point is to allow these items to be bound to a TreeView that requires all the child elements to have the same property name (for xaml binding). If I have to create new collections with a common type I'll have to iterate through each and they are large. I do not control the original collection data, so I can't modify those classes.

It sounds like you want a generic base class:

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;}
}

but unless the implementation of the properties is different, I don't see why you need an abstract base class, and it's not clear why you need subclasses at all. You can create a MyBase<SomeClass> without having to have a defined sub-type.

I do agree with Stanley. Just because you can create an abstract class doesn't mean you should. Here is the scenario when you do need an abstract class:

Suppose you are creating a method in static class to handle animal sound and do something, for example

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

Now here you don't know your animal and it's SoundType. So you create an abstract class:

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; } }
}

So here you have created universal method for handling sound using power of OOP. I hope this gives you right perspective to use abstraction.

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

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