Переопределение функций-членов «пакета» в D

У меня есть функция-член в классе с 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
} 

d dmd
person Santiago V.    schedule 29.02.2012    source источник
comment
Из того, что я вижу, B не является подклассом...   -  person DejanLekic    schedule 01.03.2012
comment
Извините, моя ошибка в примере. B - это подкласс, я это исправлю. И protected работает, но мне нужно, чтобы это было package, хе-хе.   -  person Santiago V.    schedule 01.03.2012


Ответы (1)


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

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

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

person Jonathan M Davis    schedule 01.03.2012