这基本上就是我想做的事情:
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'没有可覆盖的集合访问器
我不确定如何创建“可覆盖的设置访问器”... virtual
和abstract
似乎不允许在设置器上。
答案 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添加到基类,并使其抛出“无效操作”异常。