Я использую вымышленный пример для этого. Скажем, у меня есть класс Widget, например:
abstract class Widget
{
Widget parent;
}
Теперь мои другие классы будут производными от этого класса виджета, но предположим, что я хочу поместить в класс некоторое ограничение при определении производных типов, чтобы только определенный «тип» виджета мог быть родительским для определенного типа виджета.
Например, я создал еще два виджета из класса Widget, WidgetParent и WidgetChild. При определении дочернего класса я хочу определить тип родителя как WidgetParent, чтобы мне не приходилось каждый раз приводить родителя при его использовании.
А именно то, что я хотел бы сделать, это:
// This does not works!
class Widget<PType>: where PType: Widget
{
PType parent;
}
class WidgetParent<Widget>
{
public void Slap();
}
class WidgetChild<WidgetParent>
{
}
Так что, когда я хочу получить доступ к родителю WidgetChild, вместо того, чтобы использовать его следующим образом:
WidgetParent wp = wc.parent as WidgetParent;
if(wp != null)
{
wp.Slap();
}
else throw FakeParentException();
Я хочу использовать его таким образом (если бы я мог использовать дженерики):
wc.parent.Slap();