Переопределение функций-членов «пакета» в D - PullRequest
2 голосов
/ 01 марта 2012

У меня есть функция-член в классе с атрибутом защиты package , и я хочу переопределить ее в подклассе, в том же пакете, в другом модуле. Компилятор DMD кричит, что я не могу переопределить не виртуальную функцию. Если я сделаю функцию public, она на самом деле работает.

Почему функция пакета не является виртуальной?

Пример кода:

module test.A;
class A {
  package void doSomething() {}
}

module test.B;
import test.A;
class B : A {
  package override void doSomething() {} // ERROR! overriding a non-virtual function
} 

1 Ответ

5 голосов
/ 01 марта 2012
Функции

public и protected всегда являются виртуальными, если только компилятор не решит, что он может оптимизировать их, чтобы они были не виртуальными (что может произойти, только если вы пометите их как final, а они непереопределить что угодно).Некоторые конкретные вызовы виртуальных функций могут быть оптимизированы для не виртуальных, если компилятор может гарантировать точный тип объекта, но это вряд ли произойдет часто, учитывая, что относительно редко вы можете знать точный тип объекта (обычно толькосразу после создания с помощью new), и dmd обычно избегает анализа потока.

private и package никогда не являются виртуальными.

Электронная документация делает подразумевается, что вы можете перегрузить package, но это определенно не то, что делает компилятор, и я на 99,99% уверен, что текущее поведение является предполагаемым поведением и всегда будет поведением.Хотя я пытаюсь проверить это в группе новостей D.

...