后期动态绑定变量类型不匹配

时间:2011-04-07 02:38:14

标签: c# oop inheritance abstract-class

我给出的例子并不完全是我正在研究的,但它是一个近似的表示,并且大大简化了确切的问题。我愿意调查所有选项。

我有一个抽象类,其中包含我想在后续类中覆盖的数据值。

基本抽象类

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'”

显然我做得不对,但如果有办法覆盖变量(和类型),以便后期动态绑定仍然允许它编译,它会让我的生命无限更容易。

3 个答案:

答案 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>();

它与列表并不完美,但它似乎适用于我打算如何使用它。