Рассмотрим следующую проблему:
У вас есть класс 'A', который служит базовым классом для многих других подобных классов, например.класс с именем B.
Класс A сам по себе полезен (и уже используется повсеместно) и, следовательно, не является абстрактным.
Суть в том, что теперь вы хотите применитьновый протокол, требующий, чтобы все классы, наследуемые от A (включая саму A), реализовали метод 'func ()'.Если подкласс забывает реализовать func (), должна быть ошибка компилятора.
class A {
A func() { ret new A(...) }
}
class B : A {
A func() { ret new B(...) }
}
class C : A {
// Should give error : no func()
}
Проблема ясна?Я не могу сделать A :: func () абстрактным, так как хочу иметь возможность использовать A в качестве конкретного класса.Я не могу сделать его виртуальным, так как это приведет к тому, что подклассы обратятся к суперклассу (и не приведут к ошибкам компилятора).
Единственное, что близко подходит к решению, - это создание нового абстрактного класса A *, в котором все пользовательские типы наследуются от него и заменяет все текущие использования A в качестве конкретного класса новым классом DefaultA, которыйнаследуется от A *.Это кажется грязным.Скажите, пожалуйста, есть ли другой способ сделать это?