C#中的public class where T : class, Class, new()容易引起混淆。

4

我是C#的新手,我面对一个具有以下结构的类:

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

我需要将userID传递到get()函数中(如果可能),但我不知道如何做到这一点。我已经尝试过对此进行一些研究,但我甚至都不知道如何称呼这种定义类的方式。我来自Objective-C,那里的事情似乎更加直截了当。

2个回答

8

为了补充Christos的答案并帮助您更好地理解语法,让我们逐个解释类定义。

public - 对所有调用者可见。

class - 引用类型(即不是struct)。

SimpleGetter<TSubs> - 类名为SimpleGetter,相对于参数TSubs是通用的

: GetterBase<TSubs> - 它继承自一个基类,该基类相对于参数TSubs也是通用的。

, ISubscriptionsSingleGetter<TSubs> - 它还实现了通用接口ISubscriptionSingleGetter。

where TSubs: - 这里对泛型参数TSubs的类型有一些约束

class - 它本身也必须是引用类型。

ISimpleSubscription - 它必须实现这个(非泛型)接口。

new() - 它必须有一个公共的无参构造函数。


8

我甚至不知道这种定义类的方式叫什么

这是一个通用类。

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

这个类有一个通用类型参数 TSubs。该类继承了GetterBase<TSubs>并实现了接口ISubscriptionsSingleGetter<TSubs>。此外,TSubs必须是引用类型,并且必须具有无参构造函数,实现ISimpleSubscription接口。
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>();

创建了上述实例后,您可以调用Get方法,如Tewr在他的评论中指出的那样:
var response = ((ISubscriptionsSingleGetter<FakeSubs>)simpleGetter).Get(42);

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接