我有一個類層次結構如下:
struct Arg {
Info someSpecificInfo;
OtherInfo anotherInfo
}
class BaseEvaluator {
public:
BaseEvaluator (Info info) {};
virtual Result evaluate();
}
class SpecificEvaluator1 : public BaseEvaluator {
public:
Derived(Info info): Base(info) {};
Result evaluate();
}
class SpecificEvaluator2: public BaseEvaluator {
public:
SpecificEvaluator2(Info info): Base(info) {};
Result evaluate();
}
但是,我目前需要實作兩個特定的Evaluator類。其中一個使用 Info 物件(本質上是另一個SpecificEvaluator3類)。但是,另一個Evaluator需要整個Arg物件。
現在我知道對于 OOP,我不應該混合這兩個類,本質上我應該更改BaseEvaluator并InfoEvaluator創建另一個ArgEvaluator類,也許這兩個都可以從具有該方法的基BaseEvaluator類繼承。evalute()
然而,問題在于,對于這兩個Evaluator類,它們在很大程度上使用了相同的輔助方法,其中這些輔助方法使用了 Info 成員變數。我可以將我的兩個Evaluator類可視化如下:
class ArgSpecificEvaluator {
public:
ArgSpecificEvaluator (Arg arg) {};
Result evaluate(); // Implementation Uses OtherInfo
protected:
void helperMethod1(Info);
void helperMethod2(Info);
}
class SpecificEvaluator3 : BaseEvaluator {
public:
SpecificEvaluator3(Info info): {};
Result evaluate();
protected:
void helperMethod1(Info);
void helperMethod2(Info);
}
如您所見,helperMethods1 有重復的代碼。由于 for ArgSpecificEvaluator,當我們使用arg.Info而不是info直接作為引數時,輔助方法是相同的。在這種情況下,如何調和呢?
我是否切換到僅Arg用于所有課程?我不這樣做的原因是因為SpecificEvaluator課程甚至不需要觸摸OtherInfo。SpecificEvaluator3是一種特殊情況,它絕對是一種評估器,但具有 的特性,ArgSpecificEvaluator因為它們都使用相同的輔助方法。最初,helperMethods() 應該沒有引數并使用成員變數Info,但這種情況更難以協調,所以我決定抽象并將其放入引數中。
在某種程度上,我想要實作的是SpecificEvaluator3從基類繼承的 Java 等價物,但使用輔助方法實作介面。我如何在 C 中解決這個問題?多重繼承?
uj5u.com熱心網友回復:
我認為您要實作的目標是這樣的:
class ArgSpecificEvaluator : public SpecificEvaluator3 {
public:
ArgSpecificEvaluator (Arg arg) : Base(arg.info) {};
Result evaluate() override; // Implementation Uses OtherInfo
}
class SpecificEvaluator3 : BaseEvaluator {
public:
SpecificEvaluator3(Info info): {};
virtual Result evaluate();
protected:
void helperMethod1(Info);
void helperMethod2(Info);
}
或者那個
class Helper {
protected:
Helper(Whatever youneed);
void helperMethod1(Info);
void helperMethod2(Info);
}
class ArgSpecificEvaluator : public BaseEvaluator, protected Helper {
public:
ArgSpecificEvaluator (Arg arg) {};
Result evaluate() override; // Implementation Uses OtherInfo
}
class SpecificEvaluator3 : public BaseEvaluator , protected Helper {
public:
SpecificEvaluator3(Info info): {};
Result evaluate() override;
}
請注意,我設定ArgSpecificEvaluator為也繼承基礎BaseEvaluator ,因為它具有相同的evaluate功能。
通常,我嘗試通過將公共類的實體作為成員而不是繼承類來解決繼承的問題。
class Helper {
public:
Helper(Whatever youneed);
void helperMethod1(Info);
void helperMethod2(Info);
}
class ArgSpecificEvaluator : public BaseEvaluator {
public:
ArgSpecificEvaluator (Arg arg) {};
Result evaluate() override; // Implementation Uses OtherInfo
protected:
Helper helper;
}
class SpecificEvaluator3 : public BaseEvaluator {
public:
SpecificEvaluator3(Info info): {};
Result evaluate() override;
protected:
Helper helper;
}
我想Arg在某些情況下使用所有類并且沒有值或默認值可能也不是一個糟糕的解決方案。
轉載請註明出處,本文鏈接:https://www.uj5u.com/qukuanlian/515860.html
標籤:C 遗产
上一篇:在C#中強制繼承屬性
下一篇:如何處理包含派生類元素的基類串列
