У меня есть что-то похожее на следующую структуру в моем проекте.
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
длиной в несколько сотен строк, и есть несколько методов, как это.
Вы должны были бы сделать 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 & );
};
Других решений пока нет …