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

我确实了解继承和面向对象编程的概念。但是我对接口和抽象类中的代码感到困惑。

我也在努力理解以下三种方法。我得到了返回类型,但是方法名称后面的 <> 是什么意思。在所有情况下 new() 是什么意思。

有人可以告诉上面代码的实际含义。谢谢

4

2 回答 2

1

首先,C# 中没有多重继承。您看到的是多个接口实现,这意味着代码将公开相同的接口契约,但不共享任何实现。

尖括号中包含的类型称为泛型类型参数。最简单的解释方法是使用 IList 和 IList 接口。IList 是一个接口,其中实现使用列表语义存储对象(即,它是一组有序的对象)。问题是您存储在其中的任何内容都被转换为一个对象,因此您可以在 IList 实例中将 System.String 存储在第一个位置,将 System.Int32 存储在第二个位置。如果您只想要一个字符串列表,编译器或 IList 没有帮助。泛型解决了这个问题;IList 可能只包含 String 类型,编译器会强制执行此操作,您可以确定您只会从 IList 的实例中获取字符串实例。

您问题的最后一部分是新的;泛型类型参数可以被限制。这些where声明的部分限制了泛型类型参数可以是什么;对于 Get 方法,您可以使用任何 TResult(TResult 是类型名称的占位符),只要该类型实现 IXeroResponse。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 必须有一个无参数的公共构造函数

于 2016-07-19T00:31:42.387 回答