java — метод доступен только из суперклассов (C ++ и другие языки)

Предположим, у меня есть суперкласс, который предлагает публичный метод шаблона. Подклассы должны будут реализовать некоторые подоперации. Как мне объявить эти субоперации, чтобы они могли вызываться только из 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, но меня также очень интересуют некоторые общие замечания, касающиеся других языков.

0

Решение

В C ++ вы можете достичь своей цели, сделав op1 а также op2 private во всех классах. Эта техника идиоматична в C ++.

Базовый класс будут получить доступ к private функция в дочернем классе через v-таблицу, которая устанавливается при создании экземпляра объекта.

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

То же самое можно сказать и о Java, за исключением, конечно, что virtual является автоматическим.

1

Другие решения

используйте «частный» в обоих случаях

Закрытый метод может быть вызван из суперклассов, потому что Supercalss не знает о доступных переопределенных методах в SubClass

1

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() { ... };
}
0
По вопросам рекламы [email protected]