1

こんにちは、これらのコードを理解するのに少し助けが必要です。これらは Xero Api からのもので、残念ながらコメントがないため、以下のコードを理解するのに苦労しています。

    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();

継承とオブジェクト指向プログラミングの概念は理解しています。しかし、私はインターフェイスと抽象クラスのコードに混乱しています。

また、以下の3つの方法も理解するのに苦労しています。戻り値の型を取得しますが、メソッド名の直後の <> は何を意味しますか。そして、すべての場合で new() が意味することは何ですか。

上記のコードの実際の意味を教えてください。ありがとう

4

2 に答える 2

1

まず、C# には多重継承がありません。表示されているのは複数のインターフェイスの実装です。つまり、コードは同じインターフェイス コントラクトを公開しますが、実装は共有しません。

山かっこ内に含まれる型は、ジェネリック型引数と呼ばれます。説明する最も簡単な方法は、IList および IList インターフェイスを使用することです。IList は、実装がリスト セマンティクス (つまり、オブジェクトの順序付けられたセット) を使用してオブジェクトを格納するインターフェイスです。問題は、格納するものはすべてオブジェクトにキャストされるため、IList インスタンスの最初の位置に System.String を格納し、2 番目の位置に System.Int32 を格納できることです。文字列のリストだけが必要な場合は、コンパイラや IList の助けはありません。ジェネリックはこれを解決します。IList には String の型のみを含めることができ、コンパイラはこれを強制します。IList のインスタンスから文字列インスタンスのみを取得することを確認できます。

あなたの質問の最後の部分は新しいです。ジェネリック型の引数は制限できます。これらのwhere宣言の部分は、ジェネリック型引数が可能なものに制限を課します。Get メソッドの場合、型が IXeroResponse を実装していれば、任意の TResult を使用できます (TResult は型名のプレース ホルダーです)。new() は、TResponse に使用する型には、パブリック デフォルト (パラメーターなし) コンストラクターも必要であることを意味します。

ジェネリックについて詳しくは、MSDN: https://msdn.microsoft.com/en-us/library/512aeb7t.aspxをご覧ください。

ジェネリック型引数の制約の詳細: https://msdn.microsoft.com/en-us/library/d5x73970.aspx

于 2016-07-19T00:30:24.760 に答える
1

たとえば、TResponse : IXeroResponse の場合、new() は TResponse が IXeroResponse 型である必要があることを意味し、new() は TResponse にパラメーターのないパブリック コンストラクターが必要であることを意味します。

一般に、フォーマットはT: Myclass です。new()は、T が MyClass 型である必要があり、MyClass が 1 つのパラメーターなしのパブリック コンストラクターを持っている必要があることを意味します。

于 2016-07-19T00:31:42.387 に答える