我有两个类要从基类派生,因为它们共享极其相似的函数和成员变量,并且这两个类之间唯一的主要区别是SomeClass
vs SomeOtherClass
for algo
。解决此类问题的最佳方法是什么?
class A
{
virtual doSomething(); // is it possible to implement it here instead so I don't repeat code?
int shared_param_1;
int shared_param_2;
}
class SGBM : public A
{
SGBM()
{
algo->SGBMSpecificFunction();
}
std::shared_ptr<SomeClass> algo;
doSomething()
{
algo->compute();
// long code
}
int SGBM_param_1;
int SGBM_param_2;
}
class BM : public A
{
BM()
{
algo->BMSpecificFunction();
}
std::shared_ptr<SomeOtherClass> algo;
doSomething()
{
algo->compute();
// long completely similar code relying on algo
}
int BM_param_1;
int BM_param_2;
}
谢谢!
我认为最常见的方法是使用strategy pattern,即,SomeClass
并且SomeOtherClass
需要从公共接口派生,您将通过构造函数将算法注入基类:
class Algorithm
{
public:
virtual ~Algorithm() = default;
virtual void algo() = 0;
};
class SomeClass : public Algorithm
{
public:
void algo() override;
};
class SomeOtherClass : public Algorithm
{
public:
void algo() override;
};
class A
{
public:
explicit A(std::unique_ptr<Algorithm> algorithm)
: algorithm{std::move(algorithm)} {}
void do_something() { algorithm->algo(); }
private:
std::unique_ptr<Algorithm> algorithm;
};
class SGBM : public A
{
public:
explicit SGBM() : A{std::make_unique<SomeClass>()} {}
};
class BM : public A
{
public:
explicit BM() : A{std::make_unique<SomeOtherClass>()} {}
};
但是,这要求您能够修改SomeClass
和SomeOtherClass
(或编写包装器)。如果这不方便,您也可以为此使用CRTP
template <typename Concrete>
class A
{
public:
void do_something() { static_cast<Concrete*>(this)->algo->compute(); }
};
class SGBM : public A<SGBM>
{
private:
std::shared_ptr<SomeClass> algo;
friend class A<SGBM>;
};
class BM : public A<BM>
{
private:
std::shared_ptr<SomeOtherClass> algo;
friend class A<BM>;
};
如果您需要一个公共基类,BM
并且SGBM
您需要引入一个额外的基类,A
然后从中继承。
本文收集自互联网,转载请注明来源。
如有侵权,请联系 [email protected] 删除。
我来说两句