2016-03-07 7 views
0

Предположим, у меня есть суперкласс, который предлагает общедоступный метод шаблонов. Подклассам придется выполнять некоторые под-операции. Как объявить эти подоператоры, чтобы они могли быть вызваны только из SuperClass? Там protected, но это работает наоборот, насколько я знаю: подклассы могут получить доступ к защищенным членам суперкласса. Я хочу, чтобы суперклассы (и только суперклассы!) Вызывали элементы подкласса.Метод доступен только из суперклассов (C++ и других языков)

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

+1

В C++, они могут быть открытыми, защищены или частным. Это зависит от того, хотите ли вы предоставить их в своем базовом классе. Обычно я занимаюсь «частным», если нет веских оснований для этого. Но вы должны ограничить это одним языком программирования, если вы точно не знаете, что поведение во всех случаях одинаково. – juanchopanza

+0

Метод 'private' можно вызвать из суперклассов? Не знал этого. Но это имеет смысл, поскольку они «фактически» объявлены в этом суперклассе. – Michael

+1

Да, это общий шаблон. «Метод шаблона» или что-то в этом роде. Некоторые люди используют 'protected', обычно без уважительной причины, но' private' будет работать нормально. – juanchopanza

ответ

1

В C++, вы можете достичь своей цели пути op1 и op2private во всех классах. Этот метод является идиоматическим в C++.

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

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

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

1

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

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

0
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() { ... }; 
}