2016-03-29 10 views

Odpowiedz

7

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.

+0

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

+0

@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? –

+0

@ 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 ... –

Powiązane problemy