在DLang中,有没有办法覆盖派生类中不是函数的类字段?或者类vtable只包含函数指针?
例如,我想要以下内容来打印“bar”,但它会打印“foo”。
class Foo
{
string s = "foo";
}
class Bar : Foo
{
string s = "bar";
}
void main()
{
import std.stdio;
Foo bar = new Bar;
writeln(bar.s);
}
答案 0 :(得分:3)
只有功能可以是虚拟的。 vtable提供了一种查找函数正确覆盖的方法,但是直接访问变量时没有像使用虚拟表时那样的任何间接。
如果你想做一些类似于覆盖成员变量的事情,那么你最接近的就是一个属性函数。 e.g。
class Foo
{
@property string s() { return _s; }
private string _s = "foo";
}
class Bar : Foo
{
override @property string s() { return _s; }
private string _s = "bar";
}
void main()
{
import std.stdio;
Foo bar = new Bar;
writeln(bar.s);
}