Ich schreibe eine Anwendung in C# und wrestle mit der Implementierung von Generika. Ich habe eine Vererbungshierarchie, die von einer anderen Vererbungshierarchie (Modelle und View-Modelle) wie so gespiegelt wird:Ist es möglich, einem generischen Member einer Klasse in einer Vererbungshierarchie Typbeschränkungen aufzuerlegen?
class A_Content { }
class B_Content : A_Content
{
public string Bar;
}
class C_Content : A_Content
{
public string Foo;
}
class A { public A_Content content; }
class B : A { }
class C : A { }
public class Test
{
IList<A> A_Collection = new List<A>();
public Test()
{
B b = new B();
C c = new C();
b.content = new B_Content();
c.content = new C_Content();
A_Collection.Add(b);
A_Collection.Add(c);
}
}
Dies funktioniert gut genug, aber erzwingt keine Art Einschränkungen content
, die läßt ich es zu Gießen die richtige abgeleitete Klasse jedes Mal, wenn ich sie benutzen möchte. Ich möchte den Compiler dazu bringen, die Einschränkung zu erzwingen, dass B-Objekte nur B_Content
Inhalt haben. Mein erster Schnitt an, dass war:
class A_Content { }
class B_Content : A_Content
{
public string Bar;
}
class C_Content : A_Content
{
public string Foo;
}
class A { }
class B : A { B_Content content; }
class C : A { C_Content content; }
public class Test
{
IList<A> A_Collection = new List<A>();
public Test()
{
B b = new B();
C c = new C();
A_Collection.Add(b);
A_Collection.Add(c);
}
}
Das funktioniert gut, bedeutet aber, dass ich nicht die gemeinsamen Elemente von content
zugreifen kann, wenn alles, was ich habe eine Sammlung von A
s ist. Was ich wirklich tun möchte, ist so etwas wie:
abstract class A_Content { }
class B_Content : A_Content
{
public string Bar;
}
class C_Content : A_Content
{
public string Foo;
}
abstract class A<T> { T content; }
class B : A<B_Content> { }
class C : A<C_Content> { }
public class Test {
IList<A<A_Content>> A_Collection = new List<A<A_Content>>();
public Test()
{
B b = new B();
C c = new C();
A_Collection.Add(b);
A_Collection.Add(c);
}
}
Dies erzeugt jedoch ein Fehler, dass B nicht beschweren implizit in einen A umgewandelt werden kann, habe ich versucht, eine explizite Umwandlung ohne Erfolg hinzuzufügen. Gibt es eine Möglichkeit, die Einschränkungen, die ich suche, eleganter auszudrücken als das zweite Modell?
Wenn ich die Frage richtig verstehe, was Sie hier suchen, ist eine Schnittstelle. Sie möchten eine Liste(), auf die jede Sammlung Zugriff hat, nein? –
@BillCarey: Sie sollten nicht auf diese Weise gehen, weil Sie durch das Gießen auf einen bestimmten Typ ein Potential von OOP verlieren. Überprüfen Sie meine Antwort für eine andere Idee. – Tigran