Реализация общих функций для интерфейса

У меня есть что-то похожее на следующую структуру в моем проекте.

class ProgrammersCacluator {
public:
virtual int add(int a, int b);
virtual int rshift(int a, int b);
}

class MathematiciansCalculator {
public:
virtual int add(int a, int b);
virtual int multiply(int a, int b);
}

Я реализую это следующим образом:

class ProgrammersCalculatorI : public virtual ProgrammersCalculator {
public:
int add(int a, int b);
int rshift(int a, int b);
}

int ProgrammersCalculatorI::add(int a, int b) {
return(a + b);
}

int ProgrammersCalculatorI::rshift(int a, int b) {
return(a >> b);
}

class MathematiciansCalculatorI : public virtual MathematiciansCalculator {
public:
int add(int a, int b);
int multiply(int a, int b);
}

int MathematiciansCalculatorI::add(int a, int b) {
return(a + b);
}

int MathematiciansCalculatorI::multiply(int a, int b) {
return(a * b);
}

Теперь я понимаю, что это много дополнительного синтаксиса, но большая часть этого обеспечивается ICE (Internet Communications Engine), который является структурой, которую мы используем для взаимодействия между разделами проекта.

Что меня особенно беспокоит, так это дублирование add функция. Я пробовал множественное наследование, но это (очевидно) не сработало.

Есть ли способ настроить структуру ProgrammersCalculatorI а также MathematiciansCalculatorI такой, что add метод должен быть реализован только один раз?

В реальном проекте add длиной в несколько сотен строк, и есть несколько методов, как это.

0

Решение

Вы должны были бы сделать ProgrammersCacluator а также MathematiciansCalculator наследовать от той же базы в slice, что-то вроде этого:

interface BaseCacluator {
idempotent int add(int a, int b);
};

interface ProgrammersCacluator extends BaseCalculator {
idempotent int rshift(int a, int b);
};

interface MathematiciansCalculator extends BaseCalculator {
idempotent int multiply(int a, int b);
};

Тогда вы можете использовать множественное наследование для реализации add() только один раз и наследовать эту реализацию:

class BaseCalculatorI : virtual public BaseCalculator {
public:
virtual int add( int a, int b, const Ice::Current & );
};

class ProgrammersCalculatorI : public BaseCalculatorI, virtual public ProgrammersCalculator {
public:
virtual int rshift( int a, int b, const Ice::Current & );
};
1

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

Других решений пока нет …

По вопросам рекламы [email protected]