2016-05-03 15 views
3

Ich bin neu in C# und ich bin mit einer Klasse mit dieser Struktur konfrontiert:C# public class where T: Klasse, Klasse, neu() Verwirrung

public class SimpleGetter<TSubs> : GetterBase<TSubs>, ISubscriptionsSingleGetter<TSubs> 
    where TSubs : class, ISimpleSubscription, new() 
{ 
    UserSubscriptionsResponse<TSubs> ISubscriptionsSingleGetter<TSubs>.Get() 
    { 
     return ((ISubscriptionsSingleGetter<TSubs>)this).Get(null); 
    } 

    UserSubscriptionsResponse<TSubs> ISubscriptionsSingleGetter<TSubs>.Get(string userId) 
    { 
     return GetSubsResponse(userId); 
    } 
} 

Ich brauche userID passieren zu dem get() Funktion (wenn möglich), aber ich bin verwirrt, wie man das macht. Ich habe versucht, etwas darüber zu recherchieren, aber ich weiß nicht einmal, wie diese Art der Definition einer Klasse bezeichnet wird. Ich komme aus dem objektiven c, wo die Dinge einfacher scheinen.

+8

"Ich komme von objektiven c, wo die Dinge einfacher scheinen." - offensichtlich im Auge des Betrachters. :) – Rotem

+0

es ist eine generische Klasse für alle diese Klassen, die ISimpleSubscription implementiert –

+0

Haben Sie bereits eine Instanz dieser Klasse? – GSerg

Antwort

6

Ich weiß nicht einmal, was diese Art und Weise eine Klasse definieren

genannt Dies ist eine generische Klasse.

public class SimpleGetter<TSubs> : GetterBase<TSubs>, ISubscriptionsSingleGetter<TSubs> 
    where TSubs : class, ISimpleSubscription, new() 

, die einen generischen Typ Parameter TSubs hat. Diese Klasse erbt die GetterBase<TSubs> und implementiert die Schnittstelle ISubscriptionsSingleGetter<TSubs>. Außerdem muss der TSubs ein Referenztyp sein und einen parameterlosen Konstruktor haben, der die ISimpleSubscription Schnittstelle implementiert.

public class FakeSubs : ISimpleSubscription 
{ 
    public FakeSubs() 
    { 

    } 

    // Here you have to implement ISimpleSubscription. 
    // You could also define any properties, methods etc. 
} 

// Now you could use your generic class as below: 

var simpleGetter = new SimpleGetter<FakeSubs>(); 

das obige Beispiel erstellt haben, können Sie die Get Methode als Tewr nennen, wies in seinem Kommentar aus:

var response = ((ISubscriptionsSingleGetter<FakeSubs>)simpleGetter).Get(42); 
+1

Die Methoden sind explizite Schnittstellenimplementierungen - Sie müssen zuerst auf die Schnittstelle umstellen. – Luaan

+1

'((ISubscriptionsSingleGetter ) simpleGetter) .Get (42)' – Tewr

+0

Ich hatte eine Klasse erstellt, ähnlich wie Fakesubs, sondern hatte 'private FakeSubs() {}' Die neue Instanz-Erstellung half sehr. – pnizzle

6

Nur zur Ergänzung Christos' Antwort und helfen Ihnen, die Syntax ein bisschen besser zu verstehen, Lassen Sie uns die Klassendefinition Begriff für Ausdruck brechen.

public - für alle Anrufer sichtbar.

class - ein Referenztyp (d. H. Kein struct).

SimpleGetter<TSubs> - der Klassenname ist SimpleGetter, und es ist generic in Bezug auf den Parameter TSubs.

: GetterBase<TSubs> - es erbt von einer Basisklasse, die in Bezug auf den Parameter TSubs selbst generisch ist.

, ISubscriptionsSingleGetter<TSubs> - und es implementiert auch die generische Schnittstelle ISubscriptionSingleGetter.

where TSubs: - Es gibt einige constraints für den Typ, von dem der generische Parameter TSubs sein muss.

class - es muss auch ein Referenztyp sein.

- es muss diese (nicht-generische) Schnittstelle implementieren.

new() - es muss einen öffentlichen parameterlosen Konstruktor haben.

+0

Wow, das ist eine Goldmine. Hallo c# !!! – pnizzle

Verwandte Themen