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

时间:2011-12-31 22:33:28

标签: c# properties virtual 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);
        }
    }
}

Variable的getter在所有派生类中都是相同的,但setter需要不同。

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


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

  

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

我不确定如何创建“可覆盖的设置访问器”... virtualabstract似乎不允许在设置器上。

3 个答案:

答案 0 :(得分:8)

在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);
    }
}

答案 1 :(得分: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);
        }
    }
}

据我所知,行为将是预期的。

希望它有所帮助。

答案 2 :(得分:2)

在C#中无法执行此操作。您必须将一个setter添加到基类,并使其抛出“无效操作”异常。