我有一个类,用于描述一个可以序列化为自定义二进制格式并返回的数组。此数组具有单个类型参数,指定其值int
,double
或bool
。我想写这样的东西:
class BArray<T> where T: int, double, bool {
BArray(T[] values) { ... }
byte[] Encode() { ... }
T[] Decode(byte[] bytes) { ... }
...
}
我知道这不会编译,但是有办法吗?如果不是,那么接近这个的最佳方法是什么?从本质上讲,我需要Encode
和Decode
方法的不同行为,具体取决于数组值的类型。另外,我希望类用户不必担心不同的实现,即以下应该可以工作:
var ints = new int[] { 1, 2, 3 };
var intB = new BArray(ints);
var dbls = new double[] { 3, 4 };
var dblB = new BArray(dbls);
但是使用未实现的类型应该会失败:
var strs = new string[] { "this", "should", "fail" };
var strB = new BArray(strs); // TYPE ERROR!
谢谢!
答案 0 :(得分:3)
这是你要做的最好的事情:
abstract class BArray<T>
{
byte[] Encode();
T[] Decode(byte[] bytes);
}
class BArrayInt : BArray<int> { ... }
class BArrayDouble : BArray<double> { ... }
...
static class BArray
{
public static BArray<int> Create(int[] values)
{
return new BArrayInt(values);
}
public static BArray<double> Create(double[] values)
{
return new BArrayDouble(values);
}
...
}
每个BArray*
类都提供Encode
和Decode
的实现。 BArray<T>
班级的用户只需撰写BArray.Create(values)
,它就适用于values
类型int[]
,double[]
等您定义的内容。