删除Interface中的冗余类型

时间:2013-07-28 20:15:38

标签: c# .net generics interface

我有以下接口

public interface IRevision<TRevisionType>
{ ... }

public interface IRevisionLog
{ ... }

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

这段代码编译得很好,但我很想知道,这是真正需要的最后一个吗? 当我实现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
{ ... }

所以我的Hg会是:

public class Hg : IRevisionControl<HgRevision, HgLog>

当然,最后一个片段无法编译。

2 个答案:

答案 0 :(得分:2)

  

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

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

一种选择是为IRevision<>创建一个基本界面:

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<>中声明的任何成员 - 只能使用非通用基础接口中的成员。

答案 1 :(得分:2)

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

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