讓我介紹以下三個類:AbstractProcessor 和這兩個子類。下面的代碼并不復雜,因為只有兩個子類,但是如果procedures1兩者procedure2都有很多N候選實作呢?在這種情況下,存在NxN子類,并且會通過手動編碼進行大量重復。例如,在下面的代碼中,每個程序可以是快速的,也可以是準確的。所以有 2x2 可能的子類。
我會詢問技術/設計模式以減少重復。更準確地說,是否有任何技術可以將NxN手工編碼減少為2N手工編碼?
請注意,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)
}
};
uj5u.com熱心網友回復:
繼承不是解決一切的辦法。有時,一旦您不使用繼承,所有問題都會消失。有很多不同的方法可以做你想做的事。一種是將可呼叫物件存盤為成員:
#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,因此可以更輕松地重用它們。請注意,我必須public在課堂上制作所有內容,在您的示例中,一切都是private(它不能那樣作業)。
當您要求一種技術/設計模式時,我認為“組合優于繼承”一詞最適合這里。依賴注入和其他相關的設計模式也可以幫助您以不同的方式思考您的設計。
轉載請註明出處,本文鏈接:https://www.uj5u.com/ruanti/428626.html
上一篇:python類繼承中的關鍵字引數
