2

我有以下接口

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>

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

4

2 回答 2

2

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

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

?

于 2013-07-28T20:38:27.170 回答
2

这段代码编译得很好,但我想知道,最后一个 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<>- 只能使用非泛型基接口中的成员。

于 2013-07-28T20:24:08.227 回答