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)
你需要这样做:
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)
据我了解,行为将是预期的.
希望能帮助到你.
| 归档时间: |
|
| 查看次数: |
14465 次 |
| 最近记录: |