Предположим, у меня есть суперкласс, который предлагает публичный метод шаблона. Подклассы должны будут реализовать некоторые подоперации. Как мне объявить эти субоперации, чтобы они могли вызываться только из SuperClass
? Там в protected
Насколько я знаю, это работает наоборот: подклассы могут обращаться к защищенным членам суперкласса. Я хочу разрешить суперклассам (и только суперклассам!) Вызывать членов подкласса.
class SuperClass{
public:
void templateMethod(){
this->op1();
this->op2();
}
// how to declare these? public? protected?
virtual void op1() = 0;
virtual void op2() = 0;
}
class SubClass : public SuperClass{
// how to declare these? public? protected?
virtual void op1() { ... };
virtual void op2() { ... };
}
В настоящее время я работаю в C ++ и Matlab, но меня также очень интересуют некоторые общие замечания, касающиеся других языков.
В C ++ вы можете достичь своей цели, сделав op1
а также op2
private
во всех классах. Эта техника идиоматична в C ++.
Базовый класс будут получить доступ к private
функция в дочернем классе через v-таблицу, которая устанавливается при создании экземпляра объекта.
Конечно, ничто не мешает другой функции в вашем дочернем классе вызывать функцию, помеченную private
в этом детском классе. Если хочешь хотел сделать тот, тогда дочерний класс не будет правильным местом для функции.
То же самое можно сказать и о Java, за исключением, конечно, что virtual
является автоматическим.
используйте «частный» в обоих случаях
Закрытый метод может быть вызван из суперклассов, потому что Supercalss не знает о доступных переопределенных методах в SubClass
class SuperClass{
public:
void templateMethod(){
op1();
op2();
}
private:
virtual void op1() = 0;
virtual void op2() = 0;
}
Не нужно писать приватно, но приятно давать некоторую информацию об интерфейсе.
class SubClass : public SuperClass{
virtual void op1() { ... };
virtual void op2() { ... };
}
равно
class SubClass : public SuperClass{
private:
virtual void op1() { ... };
virtual void op2() { ... };
}