【问题标题】:How to constrait a generic class to work with just two classes如何约束一个泛型类只使用两个类
【发布时间】:2013-04-25 14:45:29
【问题描述】:

我有一个通用类对封装其他协议的协议进行建模。所有协议都实现了一个特定的接口,但这个泛型类必须只包含其中两个协议中的一个,因为在现实世界中不存在其他组合。

有没有办法指定两个允许的类?

目前我有:

public class ProtocolEncapsulator<TContainedCommand> : IBaseCommand where TContainedCommand : IBaseCommand 

但这允许框架的用户创建无意义的组​​合。

谢谢

【问题讨论】:

  • 你能给我一个这些无意义组合的例子吗?我想我没听懂。
  • 你能创建一个只有这两种类型实现的单独接口吗?我不相信type constraints 让你“或”约束,你不能重载基于类型约束的方法。
  • @ConradClark:我的意思是 ProtocolEncapsulator 只是封装了 2 种协议,因为这是制造商为他们自己的协议创建的协议(他们只有 2 个)。由于我们支持的所有协议(来自他们和其他人)都实现了 IBaseCommand,因此您可以封装没有意义的东西。
  • @BrianS:我可以,但只为这两个界面创建一个“假”界面感觉不太好,但也许这是唯一的解决方案。
  • 如果你想让它成为编译时约束(我理解这个问题),这是我能想到的最好方法。否则,您可以使用反射来检查类型并在它不是这两个选项之一时引发异常,但这会导致运行时错误,在我看来,这比编译时约束更不可取。

标签: c# .net generics constraints communication


【解决方案1】:

我建议创建一个仅由这两种协议实现的接口,然后使用类型约束来限制相关方法。

类似:

public interface IExclusiveCommand : IBaseCommand
{
    void ExclusiveMethod();  //Not necessary if there are no differences between Base and Exclusive
}

public class ProtocolEncapsulator<TContainedCommand> : IBaseCommand where TContainedCommand : IExclusiveCommand
{
}

虽然它确实添加了另一个界面并且可能被视为增加了复杂性,但我相信它实际上通过使它们更加明确和清晰来简化事情。并且编译时限制使其更易于维护和排除故障。

【讨论】:

  • 同意。但是当我实现这个时,我意识到我可以直接用新接口替换泛型类型,我不再需要一个泛型类。还是谢谢。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2019-06-27
  • 1970-01-01
  • 1970-01-01
  • 2023-03-06
  • 2017-01-21
  • 2016-06-28
相关资源
最近更新 更多