我有以下接口
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>
当然,最后一个片段无法编译。
答案 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);
}