Существует ли способ “удалить” чистую виртуальную функцию?

Scala не отменяет равенство массива, потому что это невозможно. Можно переопределить методы только при создании подклассов. Поскольку массив не имеет подклассов (что невозможно), Scala не может переопределить его методы.

5
задан Bhupesh Pant 16 July 2013 в 07:30
поделиться

9 ответов

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

И нет, нет способа удалить PVF.

42
ответ дан 18 December 2019 в 05:11
поделиться

Чистый виртуальный класс - это интерфейс, выполнение которого ожидается в вашем коде. Что бы произошло, если бы вы реализовали этот интерфейс и не реализовали ни один из методов? Как код, вызывающий ваш интерфейс, узнает, что вы не реализовали метод?

Возможны следующие варианты:

  1. Реализуйте метод, как вы описываете (если сделать его закрытым, это означает, что его не следует использовать).
  2. ] Измените иерархию классов, чтобы учесть изменение дизайна.
14
ответ дан 18 December 2019 в 05:11
поделиться

Цель производных от абстрактных классов состоит в том, чтобы внешний код мог использовать абстрактный класс и ожидать, что все функции были реализованы правильно. Возможность нереализовать метод нарушила бы эту цель, сделав код некомпилируемым. Однако вы можете создать исключение, если захотите.

9
ответ дан 18 December 2019 в 05:11
поделиться

Это вовсе не формальность. Если производный класс не демонстрирует все поведение родительского класса, он не должен быть производным от родительского. Это основной запах дизайна, и вам, вероятно, потребуется его рефакторинг.

5
ответ дан 18 December 2019 в 05:11
поделиться

Нет. Либо предоставьте реализацию по умолчанию в базовом классе, либо простую реализацию в производном классе, как вы предложили.

1
ответ дан 18 December 2019 в 05:11
поделиться

Когда вы наследуете класс, который имеет чистые виртуальные функции, вы ДОЛЖНЫ реализовать эти функции. Если вы этого не сделаете, ваш производный класс также будет абстрактным, и вы не сможете создать объект производного класса.

1
ответ дан 18 December 2019 в 05:11
поделиться

Разрешение этого не имело бы никакого смысла. Что произойдет, если вы вызовете функцию без реализации? Ошибка выполнения (это было бы глупо)? Вы можете возразить, что в некоторых случаях это может привести к ошибке времени компиляции, но это невозможно, если точный тип неизвестен (например, вы передаете указатель на экземпляр производного класса функции).

0
ответ дан 18 December 2019 в 05:11
поделиться

Хорошие ответы уже были, но если вам нужна дополнительная информация с теоретической стороны объектно-ориентированного проектирования, ознакомьтесь с принципом замены Лискова .

1
ответ дан 18 December 2019 в 05:11
поделиться

Как многие люди уже заявили, похоже, что либо базовый метод не должен быть чисто виртуальным, либо вам следует переосмыслить, действительно ли ваш производный класс является базовым ISA.

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

Я не знаю, поможет ли это вам в решении вашей проблемы или нет.

0
ответ дан 18 December 2019 в 05:11
поделиться
Другие вопросы по тегам:

Похожие вопросы: