2009-12-15 4 views
6

Если я получаю класс из другого и перезаписываю функцию, я могу вызвать базовую функцию, вызвав Base::myFunction() внутри реализации myFunc в производном классе.Принудительный класс для вызова базовой функции

Однако есть ли способ определить в моем классе Base, что базовая функция вызывается в любом случае, также без ее явного вызова в перезаписываемой функции? (Либо до, либо после того, как производная функция, исполняемая)

Или еще лучше, если у меня есть виртуальная функция в моем виртуальном Base классе, и две реализованных частных функции before() и after(), можно определить в Base классе, что до и после вызова функции в любом производном классе этого класса Base вызываются before() и after()?

Спасибо!

+4

На каком языке это? –

+2

Вероятно, C++ ('Base :: myFunction' кажется C++) –

+0

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

ответ

21

Нет, это невозможно.
Но вы можете моделировать его, вызывая другую виртуальную функцию следующим образом:

class Base 
{ 
public: 
    void myFunc() 
    { 
    before(); 
    doMyFunc(); 
    after(); 
    } 

    virtual void doMyFunc() = 0; 
}; 
+0

+1, я как раз собирался опубликовать это предложение. – Roddy

+8

Если вы сделаете виртуальную функцию защищенной (или даже частной), вы отключите другой код от вызова виртуального метода напрямую через ссылку на базу (не если у них есть ссылка на производный тип, поскольку производный класс может сделать этот метод общедоступным доступно) –

+0

Это служит моим потребностям! Спасибо :) – Mat

0

Вы пытаетесь помешать производному классу перегрузить/переопределить метод в базе. Вы можете поощрять его, отмечая методы как «не переопределяемые» (в зависимости от языка), но всегда есть способ обойти его.

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

+1

no - я хочу, чтобы метод был перезаписан - но я хочу, чтобы функция base вызывалась до реализации в производном классе – Mat

+0

Интересно, что я получил downvote * 3 * лет спустя без комментариев. – hometoast

0

Ответ на C++, вы не можете иметь унаследованную функцию «невидимо» под названием, как вы хотите.

Единственными методами, которые вызывают через унаследованные классы, являются конструкторы и деструкторы.