Как определить виртуальный геттер и абстрактный сеттер для свойства? - PullRequest
5 голосов
/ 01 января 2012

Это, по сути, то, что я хочу сделать:

public abstract class Uniform<T>
{
    public readonly int Location;
    private T _variable;

    public virtual T Variable
    {
        get { return _variable; }
    }
}

public class UniformMatrix4 : Uniform<Matrix4>
{
    public override Matrix4 Variable
    {
        set
        {
            _variable = value;
            GL.UniformMatrix4(Location, false, ref _variable);
        }
    }
}

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

На самом деле ... я бы предпочел вообще не иметь производных классов (это только один вызов функции, который будет отличаться для каждого типа), но я не могу придумать, как еще это сделать.


Редактировать: Если неясно, в чем заключается проблема, я получаю синтаксическую ошибку:

'UniformMatrix4.Variable.set': невозможно переопределить, потому что 'Uniform.Variable' не имеет переопределенного метода доступа к множеству

И я не уверен, как создать «переопределенный метод доступа к множеству» ... virtual и abstract, похоже, не разрешены на сеттере.

Ответы [ 3 ]

8 голосов
/ 01 января 2012

Невозможно сделать это в C #, но в качестве обходного пути вы можете сделать это. Это будет включать в себя вызов абстрактной установочной функции, которая может быть переопределена производными классами, оставляя стандарт без изменений. Будет ли это работать?

public abstract class Uniform<T>
{
    public readonly int Location;
    protected T _variable;

    public T Variable
    {
        get { return _variable; }
        set { SetVariable(value); } 
    }

    protected abstract void SetVariable(T value);
}

public class UniformMatrix4 : Uniform<Matrix4>
{
    public override void SetVariable(Matrix4x4 value)
    {
        _variable = value;
        GL.UniformMatrix4(Location, false, ref _variable);
    }
}
6 голосов
/ 01 января 2012

Вам нужно будет сделать это:

public abstract class Uniform<T>
{
    public readonly int Location;

    public virtual T Variable
    {
        get; set;
    }
}

public class UniformMatrix4 : Uniform<Matrix4>
{
    public override Matrix4 Variable
    {
        get
        {
            return base.Variable;
        }
        set
        {
            base.Variable = value;
            GL.UniformMatrix4(Location, false, ref value);
        }
    }
}

Как я понимаю, поведение будет ожидаемым.

Надеюсь, это поможет.

2 голосов
/ 01 января 2012

Невозможно сделать это в C #.Вы должны добавить установщик в базовый класс и заставить его вызвать исключение «Недопустимая операция».

...