Ograniczenie na T
w tym przypadku oznacza, że T
musi implementować AppBase<T>
i mieć domyślny konstruktor. Skutecznie, musisz podać siebie jako typ.
Jest to zwykle wykonywane jako próba obejścia systemu typów i zapewnienia dostępu do typu implementacji w klasie bazowej za pośrednictwem typeof(T)
. Na przykład, biorąc pod uwagę:
public interface IApp {}
public abstract class AppBase<T> : IApp where T : AppBase<T>, new()
{
public void Print()
{
Console.WriteLine(typeof(T).ToString());
}
}
public class AppBaseFoo : AppBase<AppBaseFoo>
{
}
Następnie można napisać kod takich jak:
var foo = new AppBaseFoo();
foo.Print();
Które będzie drukować informacje o typie dla AppBaseFoo
. Jednak nie jest to niezawodne - na przykład podklasy "łamią" to. Dodając:
public class AppBaseBar : AppBaseFoo {}
A potem pisząc:
var bar = new AppBaseFoo();
bar.Print();
Przyczyny tego samego AppBaseFoo
informacje mają zostać wydrukowane.
Mówiąc nieco prościej: "wymusza, że' T' jest konkretnym typem abstrakcyjnej 'AppBase'. +1 za naprawdę dobre wyjaśnienie, w tym * dlaczego * ktoś to zrobił. – CodingWithSpike
@Reed Copsey: Dziękuję za odpowiedź, bardzo dobrze wytłumaczyłeś kod, ale nadal jestem zdezorientowany co do tego, jak używa się takiego wzoru? –
@ Abhi.Net naprawdę, sugeruję unikanie go. Zwykle jest to próba uzyskania dostępu do informacji o typie podklasy z klasy bazowej, co zwykle nie jest dobrym pomysłem ... –