我有以下界面
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>
当然,这最后一个代码段不会编译。
最佳答案
这段代码可以很好地编译,但是我想知道,是否真的需要最后一个T?
是的,假设您实际上需要对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<>
中声明的任何成员-仅使用非通用基本接口中的成员。