- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我有一个案例,我有几组数字(寄存器值)。我想提高可读性并检查适当的类型(只有某些值在某些函数中有意义)。
在我的特定实现中,我将它们设为枚举 - 所以我现在有一组枚举。
现在我似乎已经结束了这种方法,因为我想将它们分成用于某些应用程序的有效枚举集 - 因此函数 A 可以例如将(来自)enumA、enumB 和 enumC 的值作为输入,但不是 enumD,它是对不同功能的描述。
我已经研究过接口(interface)中的枚举和枚举继承——两者都是死胡同,在 C# 中是不可能的。
我现在想知道这个问题的解决方案会是什么样子。我想对可能的值进行智能感知,并且还具有某种类型安全性,这样我就不能(好吧,至少在没有恶意转换的情况下不能)输入错误的值。
如何实现?
(可能的解决方案是简单地编写几个采用几个不同枚举的函数 - 仍然可行但不是很好,或者类似于 Is there a name for this pattern? (C# compile-time type-safety with "params" args of different types) - 两者似乎都不太好。)
最佳答案
一种选择是废弃枚举并使用您自己设计的类来模仿枚举。设置它们需要做更多的工作,但一旦完成,使用起来就会很容易,并且能够拥有您所描述的功能。
public class Register
{
private int value;
internal Register(int value)
{
this.value = value;
}
public static readonly Register NonSpecialRegister = new Register(0);
public static readonly Register OtherNonSpecialRegister = new Register(1);
public static readonly SpecialRegister SpecialRegister
= SpecialRegister.SpecialRegister;
public static readonly SpecialRegister OtherSpecialRegister
= SpecialRegister.OtherSpecialRegister;
public override int GetHashCode()
{
return value.GetHashCode();
}
public override bool Equals(object obj)
{
Register other = obj as Register;
if (obj == null)
return false;
return other.value == value;
}
}
public class SpecialRegister : Register
{
internal SpecialRegister(int value) : base(value) { }
public static readonly SpecialRegister SpecialRegister = new SpecialRegister(2);
public static readonly SpecialRegister OtherSpecialRegister = new SpecialRegister(3);
}
鉴于此,您可以使用如下方法:
public static void Foo(Register reg)
{
}
这可以采用任何寄存器,并且可以这样调用:
Foo(Register.NonSpecialRegister);
Foo(Register.OtherSpecialRegister);
那么你可以有另一种方法,例如:
public static void Bar(SpecialRegister reg)
{
}
它不能接受 Register.NonSpecialRegister
,但可以接受 Register.OtherSpecialRegister
或 SpecialRegister.SpecialRegister
。
关于C#:整数集的类型安全(例如枚举),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/15254047/
我是一名优秀的程序员,十分优秀!