【问题标题】:removing redundant type in Interface删除接口中的冗余类型
【发布时间】:2013-07-28 20:15:38
【问题描述】:

我有以下接口

public interface IRevision<TRevisionType>
{ ... }

public interface IRevisionLog
{ ... }

public interface IRevisionControl<in TRevision, TLogType,T>
  where TRevision : IRevision<T> 
  where TLogType : IRevisionLog
{ ... }

这段代码编译得很好,但我想知道,最后一个 T 真的需要吗? 当我实现 IRevision 时,我将传递类型 T,所以真的不需要重复类型。

我的演示实现是:

public class HgRevision : IRevision<string>
{ ...}

public class HgLog : IRevisionLog
{ ... }

public class Hg : IRevisionControl<HgRevision, HgLog, string>

我传递了两次字符串。我想知道我是否可以这样做:

public interface IRevisionControl<in TRevision, TLogType>
  where TRevision : IRevision
  where TLogType : IRevisionLog
{ ... }

所以我的汞是:

public class Hg : IRevisionControl<HgRevision, HgLog>

当然,最后这个 sn-p 不会编译。

【问题讨论】:

    标签: c# .net generics interface


    【解决方案1】:

    这段代码编译得很好,但我想知道,这最后一个 T 真的需要吗?

    是的,假设您确实需要TRevision 上的约束。如果你不这样做,那很好......但如果你这样做,你需要能够指定 which IRevision&lt;T&gt; 必须进行转换。

    一种选择是为IRevision&lt;&gt; 创建一个基本接口:

    public interface IRevision
    {
        // Include any members which don't depend on TRevisionType
    }
    
    public interface IRevision<TRevisionType> : IRevision
    {
        // The rest
    }
    

    然后你可以使用:

    public interface IRevisionControl<in TRevision, TLogType>
      where TRevision : IRevision 
      where TLogType : IRevisionLog
    

    ...当然,您将无法使用IRevision&lt;&gt; 中声明的任何成员 - 只能使用非泛型基接口中的成员。

    【讨论】:

    • 我完全了解此解决方案的局限性,但我将在我的 Hg 类中使用具体类型 HgRevision,所以这没关系。谢谢!
    【解决方案2】:

    您确定在IRevisionControl 的声明中需要TRevision 吗?我的意思是,在类声明中是有意义的,因为类方法中的某些代码只能与特定的TRevision 一起使用,但在接口中,也许这就足够了:

    public interface IRevisionControl<TRevisionType, TLogType>
      where TLogType : IRevisionLog
    {
         void Foo(IRevision<TRevisionType> revision);
    }
    

    ?

    【讨论】:

    • 使用这种模式我不能强制 TRevisionType 从 IRevision 实现
    • 根据您的代码,TRevisionType 不应该从IRevision 实现,它是IRevision 的类型参数。我错过了什么吗?
    • 你是对的,错字。我想通过 IRevision 实现 TRevision。我想在我的 IRevisionControl 实现中使用具体类型。 Skeet 的方式没问题。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-10-16
    • 2011-10-22
    • 1970-01-01
    • 2016-08-02
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多