覆盖D中的非函数类成员

时间:2018-05-13 14:57:46

标签: class inheritance d

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

1 个答案:

答案 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);
}