C# 删除接口中的冗余类型
我有以下接口C# 删除接口中的冗余类型,c#,.net,generics,interface,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 { ... }
public interface IRevision<TRevisionType>
{ ... }
public interface IRevisionLog
{ ... }
public interface IRevisionControl<in TRevision, TLogType,T>
where TRevision : IRevision<T>
where TLogType : IRevisionLog
{ ... }
公共接口IRevision
{ ... }
公共接口IRevisionLog
{ ... }
公共接口iVisionControl
TRevision在哪里:IRevision
其中TLogType:IRevisionLog
{ ... }
这段代码编译得很好,但我想知道,最后一段代码真的不需要吗?
当我实现IRevision时,我将传递类型T,所以实际上不需要复制类型
我的演示实现是:
public class HgRevision : IRevision<string>
{ ...}
public class HgLog : IRevisionLog
{ ... }
public class Hg : IRevisionControl<HgRevision, HgLog, string>
public class Hg : IRevisionControl<HgRevision, HgLog>
公共类HG修订版:IRevision
{ ...}
公共类HgLog:IRevisionLog
{ ... }
公共类Hg:IRevisionControl
我把绳子传了两次。我想知道我是否可以这样做:
public interface IRevisionControl<in TRevision, TLogType>
where TRevision : IRevision
where TLogType : IRevisionLog
{ ... }
公共接口iVisionControl
TRevision在哪里:IRevision
其中TLogType:IRevisionLog
{ ... }
所以我的Hg应该是:
public class HgRevision : IRevision<string>
{ ...}
public class HgLog : IRevisionLog
{ ... }
public class Hg : IRevisionControl<HgRevision, HgLog, string>
public class Hg : IRevisionControl<HgRevision, HgLog>
public类Hg:IRevisionControl
当然,最后一个代码段不会编译
这段代码编译得很好,但我想知道,最后一段代码真的不需要吗
是的,假设您确实需要TRevision
上的约束。如果你没有,那很好。。。但是如果您这样做,您需要能够指定必须转换到哪个IRevision
一个选项是为IRevision创建一个基本接口:
公共接口IRevision
{
//包括任何不依赖TRevisionType的成员
}
公共界面IRevision:IRevision
{
//其余的
}
然后您可以使用:
public interface IRevisionControl<in TRevision, TLogType>
where TRevision : IRevision
where TLogType : IRevisionLog
公共接口iVisionControl
TRevision在哪里:IRevision
其中TLogType:IRevisionLog
。。。但是当然,您将无法使用在IRevision
中声明的任何成员-仅使用非泛型基本接口中的成员
这段代码编译得很好,但我想知道,最后一段代码真的不需要吗
是的,假设您确实需要TRevision
上的约束。如果你没有,那很好。。。但是如果您这样做,您需要能够指定必须转换到哪个IRevision
一个选项是为IRevision创建一个基本接口:
公共接口IRevision
{
//包括任何不依赖TRevisionType的成员
}
公共界面IRevision:IRevision
{
//其余的
}
然后您可以使用:
public interface IRevisionControl<in TRevision, TLogType>
where TRevision : IRevision
where TLogType : IRevisionLog
公共接口iVisionControl
TRevision在哪里:IRevision
其中TLogType:IRevisionLog
。。。但是当然,您将无法使用在
IRevision
中声明的任何成员-仅使用非通用基本界面中的成员。您确定在IRevisionControl
声明中需要TRevision
?我的意思是,这在类声明中是有意义的,因为类方法中的一些代码只能与特定的TRevision
一起工作,但在接口中,这可能就足够了:
public interface IRevisionControl<TRevisionType, TLogType>
where TLogType : IRevisionLog
{
void Foo(IRevision<TRevisionType> revision);
}
公共接口iVisionControl
其中TLogType:IRevisionLog
{
void Foo(IRevision修订版);
}
?您确定在
iVisionControl
的声明中需要TRevision
?我的意思是,这在类声明中是有意义的,因为类方法中的一些代码只能与特定的TRevision
一起工作,但在接口中,这可能就足够了:
public interface IRevisionControl<TRevisionType, TLogType>
where TLogType : IRevisionLog
{
void Foo(IRevision<TRevisionType> revision);
}
公共接口iVisionControl
其中TLogType:IRevisionLog
{
void Foo(IRevision修订版);
}
?使用此模式,我无法强制从IRevision实现TRevisionType根据您的代码,
TRevisionType
不应从IRevision
实现,它是IRevision
的类型参数。我遗漏了什么吗?你说得对,打字错误。我想让IRevision实现TRevision。我想在我的IRevisionControl实现中使用具体类型。Skeet的方法是可以的。使用这种模式,我不能强制从IRevision实现TRevisionType。根据您的代码,TRevisionType
不应该从IRevision
实现,它是IRevision
的类型参数。我遗漏了什么吗?你说得对,打字错误。我想让IRevision实现TRevision。我想在我的IRevisionControl实现中使用具体类型。Skeet的方法是可以的。我完全知道这个解决方案的局限性,但我会在我的Hg类中使用具体类型的HgRevision,所以这是可以的。谢谢我完全了解这个解决方案的局限性,但我将在我的Hg类中使用具体类型的HgRevision,所以这是可以的。谢谢