【问题标题】:C# public class where T : class, Class, new() confusionC# public class where T : class, Class, new() 混淆
【发布时间】:2016-08-28 03:48:15
【问题描述】:

我是 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() 函数(如果可能的话),但我对如何做到这一点感到困惑。我试图对此进行一些研究,但我什至不知道这种定义类的方式叫什么。我来自目标 c,那里的事情看起来更直接。

【问题讨论】:

    标签: c# class inheritance abstract-class


    【解决方案1】:

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

    这是一个泛型类。

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

    它有一个泛型类型参数TSubs。该类继承 GetterBase&lt;TSubs&gt;,实现接口ISubscriptionsSingleGetter&lt;TSubs&gt;。此外,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);
    

    【讨论】:

      【解决方案2】:

      只是为了补充 Christos 的回答并帮助您更好地理解语法,让我们逐项分解类定义。

      public - 对所有调用者可见。

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

      SimpleGetter&lt;TSubs&gt; - 类名为 SimpleGetter,相对于参数 TSubs 为 generic

      : GetterBase&lt;TSubs&gt; - 它继承自一个基类,该基类本身就参数 TSubs 而言是通用的。

      , ISubscriptionsSingleGetter&lt;TSubs&gt; - 它还实现了通用接口 ISubscriptionSingleGetter。

      where TSubs: - 泛型参数 TSubs 必须属于的类型有一些 constraints

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

      ISimpleSubscription - 它必须实现这个(非通用)接口。

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

      【讨论】:

        猜你喜欢
        • 2021-09-23
        • 1970-01-01
        • 1970-01-01
        • 2019-07-30
        • 1970-01-01
        • 1970-01-01
        • 2013-08-08
        • 1970-01-01
        相关资源
        最近更新 更多