So etwas wie eine Selbstbeschränkung ermöglicht es Ihnen, abgeleitete Typen zu belichten und auch zugleich einschränken:
abstract class Foo<T> where T : Foo<T>
{
protected abstract void Process(FooProcessor<T> processor);
}
Dann abgeleitete Typen definieren sich als Ziel:
class FooChild : Foo<FooChild>
{
protected override void Process(FooProcessor<FooChild> processor)
{
}
}
Bitte beachten obwohl dieses Design dazu neigt, nur eine kleine Reihe von Verwendungen zu haben. Außerdem verlieren Sie die Möglichkeit, auf Foo
als Basis zu verweisen, ohne seinen generischen Typ anzugeben.
Es gibt auch eine blog post from Eric Lippert darüber, wie es möglich ist, dieses Design zu missbrauchen, also sollten Sie überlegen, was Sie tatsächlich erreichen wollen, indem Sie möchten, dass Ihre geschützte Methode direkt auf die abgeleitete Klasse verweist.
Sie können besser mit den Schnittstellen arbeiten, um das Verhalten einzukapseln, das Sie erreichen möchten.
In diesem Fall Kind chass Unterschrift ziemlich seltsam ist .. –
Ich glaube nicht, seine möglich , weil Foo generisch ist - es gibt keine nicht-generische Foo-Klasse –
@SergeyMetlov Ich habe diesen Ansatz schon einmal gesehen, um einen stark typisierten Verweis auf eine abgeleitete Klasse von einem Basistyp aus verfügbar zu machen, es fühlt sich immer etwas rückwärts an und ehrlich zu sein, habe ich nicht persönlich gebraucht um diesen Ansatz zu verwenden. –