继承中的多个override-methods各有多种可能的实现
Multiple override-methods in inheritance each have multiple possible implementations
下面介绍三个类:AbstractProcessor和child类这两个。下面的代码并不复杂,因为只有两个 child 类,但是如果 procedures1
和 procedure2
都有很多 N
候选实现呢?在这种情况下,有 NxN
child 类 并且 hand-coding 会产生大量重复。例如,在下面的代码中,每个过程可以是快速的,也可以是准确的。所以有 2x2 种可能 child 类.
我会询问 technique/design 模式以减少重复。更准确地说,是否有任何技术可以将 NxN
hand-coding 减少到 2N
hand-coding?
注意到procedure1
和procedure2
都必须共享相同的var_
(在我的例子中是机器人物理世界的测量值)和共同的功能foo()
, procedure1
和 procudure2
很难由 has-a 关系组成。实际上在我的应用程序中,有很多 var_
因为机器人访问许多类型的传感器。
class AbstractProcessor
{
virtual void procedure1() = 0;
virtual void procedure2() = 0;
Something foo(){ // ...
}
double var_;
void run(){
procedure1();
procedure2();
}
};
class FastProcessor : public AbstractProcessor
{
void procedure1() override {// ... fast procedure ( use foo and var_ inside)
}
void procedure2() override {// ... fast procedure ( use foo and var_ inside)
}
};
class AccurateProcessor : public AbstractProcessor
{
void procedure1() override {// ... accurate procedure ( use foo and var_ inside)
}
void procedure2() override {// ... accurate procedure ( use foo and var_ inside)
}
};
继承并不是万能的。有时,一旦不使用继承,所有问题都消失了。有很多不同的方法可以做你想做的事。一种是将可调用对象存储为成员:
#include <functional>
#include <iostream>
struct Processor
{
std::function<void(Processor*)> procedure1;
std::function<void(Processor*)> procedure2;
double var_ = 42.0;
void foo() {
std::cout << "hello foo\n";
}
void run(){
procedure1(this);
procedure2(this);
}
};
int main() {
Processor proc{
[](auto p) { std::cout << p->var_ << "\n";},
[](auto p) { p->foo(); }
};
proc.run();
}
构造函数的参数可以是自由函数而不是 lambda,这样它们可以更容易地被重用。请注意,我必须在 class 中制作所有内容 public
,在您的示例中,所有内容都是 private
(它不能那样工作)。
当您要求 technique/design 模式时,我认为术语“继承之上的组合”最适合这里。依赖注入和其他相关设计模式也可能帮助您以不同的方式思考您的设计。
下面介绍三个类:AbstractProcessor和child类这两个。下面的代码并不复杂,因为只有两个 child 类,但是如果 procedures1
和 procedure2
都有很多 N
候选实现呢?在这种情况下,有 NxN
child 类 并且 hand-coding 会产生大量重复。例如,在下面的代码中,每个过程可以是快速的,也可以是准确的。所以有 2x2 种可能 child 类.
我会询问 technique/design 模式以减少重复。更准确地说,是否有任何技术可以将 NxN
hand-coding 减少到 2N
hand-coding?
注意到procedure1
和procedure2
都必须共享相同的var_
(在我的例子中是机器人物理世界的测量值)和共同的功能foo()
, procedure1
和 procudure2
很难由 has-a 关系组成。实际上在我的应用程序中,有很多 var_
因为机器人访问许多类型的传感器。
class AbstractProcessor
{
virtual void procedure1() = 0;
virtual void procedure2() = 0;
Something foo(){ // ...
}
double var_;
void run(){
procedure1();
procedure2();
}
};
class FastProcessor : public AbstractProcessor
{
void procedure1() override {// ... fast procedure ( use foo and var_ inside)
}
void procedure2() override {// ... fast procedure ( use foo and var_ inside)
}
};
class AccurateProcessor : public AbstractProcessor
{
void procedure1() override {// ... accurate procedure ( use foo and var_ inside)
}
void procedure2() override {// ... accurate procedure ( use foo and var_ inside)
}
};
继承并不是万能的。有时,一旦不使用继承,所有问题都消失了。有很多不同的方法可以做你想做的事。一种是将可调用对象存储为成员:
#include <functional>
#include <iostream>
struct Processor
{
std::function<void(Processor*)> procedure1;
std::function<void(Processor*)> procedure2;
double var_ = 42.0;
void foo() {
std::cout << "hello foo\n";
}
void run(){
procedure1(this);
procedure2(this);
}
};
int main() {
Processor proc{
[](auto p) { std::cout << p->var_ << "\n";},
[](auto p) { p->foo(); }
};
proc.run();
}
构造函数的参数可以是自由函数而不是 lambda,这样它们可以更容易地被重用。请注意,我必须在 class 中制作所有内容 public
,在您的示例中,所有内容都是 private
(它不能那样工作)。
当您要求 technique/design 模式时,我认为术语“继承之上的组合”最适合这里。依赖注入和其他相关设计模式也可能帮助您以不同的方式思考您的设计。