我给出的例子并不完全是我正在研究的,但它是一个近似的表示,并且大大简化了确切的问题。我愿意调查所有选项。
我有一个抽象类,其中包含我想在后续类中覆盖的数据值。
基本抽象类
public abstract class Variable
{
public abstract long data;
}
我有一个子类
public class FloatVariable : Variable
{
public override float data;
}
然而,当使用后期动态绑定时,我遇到了麻烦
Variable var = new FloatVariable();
var.data = 0.33f;
导致错误“无法将类型'float'隐式转换为'long'”
显然我做得不对,但如果有办法覆盖变量(和类型),以便后期动态绑定仍然允许它编译,它会让我的生命无限更容易。
答案 0 :(得分:3)
使用泛型可能会更好:
public class Variable<T>
{
public T data;
}
然后你可以做
Variable var = new Variable<float>();
var.data = 0.33f;
答案 1 :(得分:1)
来自http://msdn.microsoft.com/en-us/library/ebca9ah3(v=vs.80).aspx:
“重写属性声明必须指定与继承属性完全相同的访问修饰符,类型和名称,并且重写的属性必须是虚拟,抽象或覆盖。”
因此,您无法将类型从long更改为float。
答案 2 :(得分:0)
我找到了一个解决我的问题的解决方案,我无法通过泛型/模板解决。
创建一个新的标量类
Class Scalar
{
private byte dataByte = 0;
private short dataShort = 0;
// ... int, long, float, double
private string dataString = 0;
private List<Variable> dataList = null;
//constructors for "later" type casting (see below)
public Scalar(byte data)
{
this.dataByte = data;
}
//* repeat this for short, int, long, float, double, string, List<>
//implicit conversions for getting data out
public static implicit operator byte(Scalar scalar)
{
return scalar.dataByte;
}
//* repeat this for short, int, long, float, double, string, List<>
//implicit conversions for getting data in (invokes a constructor)
public static implicit operator Scalar(byte data)
{
return new Scalar(data);
}
//* repeat this for short, int, long, float, double, string, List<>
}
然后创建我的基础变量类
abstract class Variable
{
public Scalar Data
{
get { return data; }
set { data = value; }
}
protected Scalar data = new Scalar(0);
/* other meta information etc */
}
然后创建元变量的子类
class MetaByte : Variable
{
public byte Data
{
get { return data; }
set { data = value; }
}
/* byte specific features */
}
然后使用它可以很好地使用动态绑定
Variable scalar = new MetaByte();
scalar.Data = 33;
scalar = new MetaList();
scalar.Data = new List<Variable>();
它与列表并不完美,但它似乎适用于我打算如何使用它。