Позднее несоответствие типов динамической привязки - PullRequest
0 голосов
/ 07 апреля 2011

Пример, который я привожу, не совсем то, над чем я работаю, но это приблизительное представление и значительно упрощенное для точной задачи. Я готов исследовать все варианты.

У меня есть абстрактный класс со значением данных, которое я хочу переопределить в следующем классе.

Базовый абстрактный класс

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 ]

3 голосов
/ 07 апреля 2011

Вам может быть лучше использовать дженерики:

public class Variable<T>
{
    public T data;
}

тогда вы можете сделать

Variable var = new Variable<float>();
var.data = 0.33f;
1 голос
/ 07 апреля 2011

С http://msdn.microsoft.com/en-us/library/ebca9ah3(v=vs.80).aspx:

"Объявление переопределенного свойства должно указывать точно такой же модификатор доступа, тип и имя, что и унаследованное свойство, а переопределенное свойство должно быть виртуальным, абстрактным или переопределенным."

Таким образом, вы не можете изменить тип с long на float.

0 голосов
/ 08 апреля 2011

Я нашел решение, которое решает мою проблему, которую я не смог решить с помощью шаблонов / шаблонов.

Создайте новый скалярный класс

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

Он не идеален для списков, нокажется, это работает для того, как я собираюсь использовать его.

...