Ich verwende dazu ein fiktives Beispiel. Sagen wir, ich habe eine Widget-Klasse wie:
abstract class Widget
{
Widget parent;
}
Nun würden meine anderen Klassen von dieser Widget-Klasse abgeleitet werden, aber nehmen wir an, ich möchte eine Einschränkung in die Klasse aufnehmen, während ich die abgeleiteten Typen definiere, so dass nur ein bestimmter "Typ" von Widget einem bestimmten Typ von Widget übergeordnet sein kann.
Ich habe zum Beispiel zwei weitere Widgets von der Widget-Klasse abgeleitet, WidgetParent und WidgetChild. Bei der Definition der Child-Klasse möchte ich den Typ des Elternteils als WidgetParent definieren, damit ich nicht jedes Mal, wenn ich es verwende, den Typ des Elternteils ändern muss.
Genau, das hätte ich gerne getan:
// This does not works!
class Widget<PType>: where PType: Widget
{
PType parent;
}
class WidgetParent<Widget>
{
public void Slap();
}
class WidgetChild<WidgetParent>
{
}
Wenn ich also auf das übergeordnete Element von WidgetChild zugreifen möchte, anstatt es auf diese Weise zu verwenden:
WidgetParent wp = wc.parent as WidgetParent;
if(wp != null)
{
wp.Slap();
}
else throw FakeParentException();
Ich möchte es auf diese Weise verwenden (wenn ich Generika verwenden könnte):
wc.parent.Slap();