覆盖 D 中的非函数 class 成员
Overriding non-function class members in D
在 DLang 中,有没有一种方法可以覆盖 class 在派生 class 中不是函数的字段?还是 class vtables 只包含函数指针?
例如,我希望下面的代码打印 "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);
}
只有函数可以是虚函数。 vtable 提供了一种方法来查找函数的正确覆盖,但是变量是直接访问的,没有像使用虚拟 table.
时那样的任何间接访问。
如果您想做一些类似于覆盖成员变量的事情,那么最接近的是 属性 函数。例如
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);
}
在 DLang 中,有没有一种方法可以覆盖 class 在派生 class 中不是函数的字段?还是 class vtables 只包含函数指针?
例如,我希望下面的代码打印 "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);
}
只有函数可以是虚函数。 vtable 提供了一种方法来查找函数的正确覆盖,但是变量是直接访问的,没有像使用虚拟 table.
时那样的任何间接访问。如果您想做一些类似于覆盖成员变量的事情,那么最接近的是 属性 函数。例如
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);
}