2016-07-19 30 views
1

Hallo, ich brauche ein wenig Hilfe, um diese Codes zu verstehen. Diese sind von Xero Api und leider gibt es keine Kommentare, also kämpfe ich, um die folgenden Codes zu verstehen.Multpile Vererbung und andere Art von Methode. Was bedeutet diese Art von Methode und Vererbung?

public abstract class XeroReadEndpoint<T, TResult, TResponse> : IXeroReadEndpoint<T, TResult, TResponse> 
       where T : XeroReadEndpoint<T, TResult, TResponse> 
       where TResponse : IXeroResponse<TResult>, new() 

    public interface IXeroUpdateEndpoint<T, TResult, TRequest, TResponse> 
       : IXeroCreateEndpoint<T, TResult, TRequest, TResponse> 
       where T : XeroReadEndpoint<T, TResult, TResponse> 
       where TResponse : IXeroResponse<TResult>, new() 
       where TRequest : IXeroRequest<TResult>, new() 

public IEnumerable<TResult> Delete<TResult, TResponse>(string endPoint) where TResponse : IXeroResponse<TResult>, new(); 

public IEnumerable<TResult> Put<TResult, TResponse>(string endPoint, object data) where TResponse : IXeroResponse<TResult>, new(); 

public IEnumerable<TResult> Get<TResult, TResponse>(string endPoint) where TResponse : IXeroResponse<TResult>, new(); 

Ich verstehe das Konzept der Vererbung und objektorientierte Programmierung. Aber ich bin verwirrt in den Codes in der Schnittstelle und der abstrakten Klasse.

Auch kämpfe ich um die folgenden drei Methoden zu verstehen. Ich bekomme den Rückgabetyp, aber was bedeutet <> direkt nach dem Methodennamen. Und was bedeutet es in allen Fällen mit new()?

Kann jemand bitte die tatsächliche Bedeutung der obigen Codes sagen. Danke

Antwort

1

Zum Starten gibt es keine Mehrfachvererbung in C#. Was Sie sehen, ist die Implementierung mehrerer Schnittstellen, was bedeutet, dass der Code die gleichen Schnittstellenverträge offenlegt, aber keine Implementierung freigibt.

In den spitzen Klammern enthaltene Typen werden als generische Typargumente bezeichnet. Am einfachsten erklären Sie dies mit den Schnittstellen IList und IList. IList ist eine Schnittstelle, in der Implementierungen Objekte mithilfe der Listensemantik speichern (dh eine geordnete Menge von Objekten). Das Problem besteht darin, dass alles, was Sie darin speichern, in ein Objekt umgewandelt wird, sodass Sie in einer IList-Instanz einen System.String an der ersten Position und eine System.Int32 in der zweiten Position speichern können. Wenn Sie nur eine Liste von Strings wollen, keine Hilfe vom Compiler oder IList. Generika lösen das; Eine IList darf nur String-Typen enthalten, und der Compiler wird dies erzwingen, und Sie können sicher sein, dass Sie nur String-Instanzen von Instanzen einer IList erhalten.

Der letzte Teil Ihrer Frage ist der neue; Generische Argumenttypen können begrenzt werden. Die where portion dieser Deklarationen setzt Grenzen für das generische Argument type; Für die Get-Methode können Sie jedes TResult (TResult ist ein Platzhalter für einen Typnamen) verwenden, sofern der Typ IXeroResponse implementiert. Das new() bedeutet, dass der Typ, den Sie für TResponse verwenden, auch einen öffentlichen (parameterlosen) Standardkonstruktor haben muss.

Sie können mehr über Generika bei MSDN lesen: https://msdn.microsoft.com/en-us/library/512aeb7t.aspx

Mehr auf generische Art Argumente beschränke: https://msdn.microsoft.com/en-us/library/d5x73970.aspx

1

Zum Beispiel, wo tAntwort: IXeroResponse, neu() bedeutet, dass die tAntwort vom Typ IXeroResponse sein muss und neue() bedeutet, dass TResponse parameterlosen öffentlichen Konstruktor haben muss.

Im Allgemeinen ist das Format where T: Myclass, new() bedeutet T vom Typ MyClass sein muss und MyClass muss man parameterlos öffentlichen Konstruktor

haben