如何为属性定义虚拟getter和抽象setter?

mpe*_*pen 6 c# virtual properties abstract

这基本上就是我想做的事情:

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);
        }
    }
}
Run Code Online (Sandbox Code Playgroud)

getter for Variable将在所有派生类中相同,但setter需要不同.

事实上......我宁愿根本没有派生类(它只是一个函数调用,每种类型都会有所不同),但我想不出怎么做.


编辑:如果不清楚我遇到的问题是什么,我收到语法错误:

'UniformMatrix4.Variable.set':无法覆盖,因为'Uniform.Variable'没有可覆盖的set访问器

而且我不确定如何创建一个"可覆盖的set accessor"...... virtual并且abstract似乎不允许在setter上.

Dr.*_*ABT 10

在C#中不可能这样做,但作为一种解决方法,你可以做到这一点.它将涉及调用一个抽象的setter函数,该函数可以被派生类覆盖,同时保持标准完整.这会有用吗?

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);
    }
}
Run Code Online (Sandbox Code Playgroud)


Ivo*_*Ivo 6

你需要这样做:

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);
        }
    }
}
Run Code Online (Sandbox Code Playgroud)

据我了解,行为将是预期的.

希望能帮助到你.