2016-08-01 12 views
1

Ich versuche, das Folgende zu erreichen, aber ich bin mir nicht sicher, ob es überhaupt möglich ist.Collection Vererbung

Ich habe folgende 'Basis' Entitäten

public abstract class BaseObject {} 
public abstract class BaseCollection <T> : ObservableCollection<T> where T : BaseObject {} 

Ich habe auch

public class Obj_1: BaseObject {} 
public class Obj_1_collection : BaseCollection <Obj_1> 
{ 
    public Obj_1_Method_1() {} 
} 

und

public class Obj_2: Obj_1 {} 

Nach der gleichen Logik wie Obj_1, ich möchte eine Obj_2_collection haben . Ich möchte, dass diese Sammlung von Obj_1_collection erbt, um auf ihre Methoden zuzugreifen, z. Obj_2_collection.Obj_1_Method_1(). Wie ich es in meinem Kopf habe ich versuche, so etwas wie die folgenden (in Pseudo-Code) zu tun:

public class Obj_2_collection : Obj_1_collection<Obj_2 extends Obj_1> 

was bedeutet, dass die Obj_2_collectionObj_1_collection zugreifen kann, aber die Objektsammlung es vom Typ seiner Obj_2

+0

Haben Sie versucht, Ihre 'Obj_1_collection' als' öffentliche Klasse zu definieren Obj_1_collection : Base where T: Obj_1 {} ' – Sidewinder94

+0

Obj_1 und Obj_2 müssen das gleiche erben Basisklasse BaseObject. In deinem Code hast du Obj_2 Obj_1 erben. – jdweng

+2

@jdweng was bedeutet, dass 'Obj_2' auch von' BaseObject' geerbt wird – Sidewinder94

Antwort

1

Sie sind fast da, Ihr einziges Problem ist, dass Sie Ihre Obj_1_collection nicht als generisch definiert haben.

so zu tun, müssen Sie nur die Syntax verwenden Sie für die BaseCollection<T> verwendet und zu Obj_1

den Typ T einschränken, die geben würde:

public class Obj_1_collection<T> : BaseCollection <T> where T : Obj_1 {} 

In Bezug auf die Verwendung von Generika und das Erbe Vielleicht möchten Sie mehr über das Schlüsselwort in und out lesen, um covariance und contravariance zu aktivieren.

Als Randbemerkung, hier sind die C# naming conventions

+0

Nach ein paar schnellen Tests scheint Ihr Vorschlag zu funktionieren. Ich muss es in einem "realen" Beispiel testen, bevor ich akzeptiere, aber ich bin sicher, dass Sie das "Häkchen" bekommen werden. Für jetzt +1 für die verknüpften Ressourcen. Und ein Haftungsausschluss, ich bin vertraut mit den Namenskonventionen, die Benennung und der Code dient nur zu Beispielszwecken. – Athafoud

+0

@Athafoud Das ist alles gut dann :) Besser, sie verbunden zu haben, wenn sie nicht nützlich sind, als sie nicht zu verbinden, während sie benötigt werden: p – Sidewinder94

+0

Das einzige Problem, das ich sehen kann, ist, dass jedes Mal, wenn ich 'Obj_1_collection' verwende, ich muss instanziieren Sie es als 'neue Obj_1_collection ()'. Das bedeutet viel Refactoring, etwas, das ich vermeiden möchte. – Athafoud