Переопределение не функциональных членов класса в D - PullRequest
0 голосов
/ 13 мая 2018

Есть ли в DLang способ переопределить поля класса, которые не являются функциями в производном классе?Или виртуальные таблицы классов содержат только указатели на функции?

Например, я хотел бы, чтобы следующее напечатало "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 голосов
/ 13 мая 2018

Только функции могут быть виртуальными. Vtable предоставляет способ найти правильное переопределение для функции, но к переменным обращаются напрямую без каких-либо косвенных указаний, как при использовании виртуальной таблицы.

Если вы хотите сделать что-то похожее на переопределение переменной-члена, то ближе всего вы получите функцию свойства. например,

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