2016-04-22 5 views
0

Der Versuch, das .NET-Äquivalent mit Hilfe von Generika herauszufinden (seit einigen Jahren mache ich Java). Hier einige Pseudo-Code für das, was ich will:Kann ich eine generische Auflistung in einer abstrakten Basisklasseneigenschaft verwenden?

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

Dann habe ich zwei Klassen, die von myBase erben jeweils die zwei Eigenschaften implementieren würde und die Typen von Objekten in der Sammlung verschiedener würde e.

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

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

Der Punkt ist, diese Elemente zu ermöglichen, eine TreeView gebunden zu sein, die Elemente alle Kind erfordert die gleiche Eigenschaft Namen haben (für XAML-Bindung). Wenn ich neue Sammlungen mit einem gemeinsamen Typ erstellen muss, muss ich sie jeweils durchlaufen und sie sind groß. Ich verwalte die ursprünglichen Sammlungsdaten nicht, daher kann ich diese Klassen nicht ändern.

+4

Anstatt Pseudocode zu schreiben, könnten Sie versuchen, ein [mcve] zu schreiben? Es sieht für mich so aus, als müsste MyBase generisch sein und dann eine 'MyBase ' und eine' MyBase 'erstellen - es ist nicht klar, dass Sie die beiden Unterklassen überhaupt brauchen. –

+0

Warum sollte sich die Eigenschaftenimplementierung in den Unterklassen von der Basisklasse (außer dem generischen Typ) unterscheiden? –

Antwort

3

Es klingt wie Sie eine generische Basisklasse wollen:

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

aber es sei denn, die Umsetzung der Eigenschaften anders, ich sehe nicht, warum Sie eine abstrakte Basisklasse benötigen, und es ist nicht klar, warum brauchst du überhaupt Unterklassen? Sie können MyBase<SomeClass> erstellen, ohne einen definierten Untertyp zu haben.

0

Ich stimme Stanley. Nur weil Sie eine abstrakte Klasse erstellen können, heißt das nicht, dass Sie es sollten. Hier ist das Szenario, wenn Sie eine abstrakte Klasse brauchen:

Angenommen, Sie sind ein Verfahren, bei statischer Klasse zu schaffen Tierton zu handhaben und etwas zu tun, zum Beispiel

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

Hier Sie nicht wissen, Ihr Tier und es ist SoundType. So erstellen Sie eine abstrakte Klasse:

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, hier haben Sie universelle Methode erstellt Sounds für den Umgang mit Macht des OOP verwenden. Ich hoffe, das gibt dir die richtige Perspektive, Abstraktion zu benutzen.

Verwandte Themen