質問のより良い要約を反映するタイトル編集は大歓迎です。
これらの3つのクラスを何らかの方法でリファクタリングして、で表される重複フィールドを削除したいと思いclass C
ます(階層を参照)。フィールドを親クラスにプルアップすることを考えましたが、問題は、AとBが「is-a」と見なされるほど類似しておらず、Cが両方と見なされ、文字通り1つのメンバーフィールドであるため、クラスを作成することです。一つのことを保持するだけでは少しやり過ぎのようです。
階層:
(abstract data type)
class A : public O {
public:
//...
std::string GetName();
std::string GetName() const;
void SetName(std::string name);
//...
protected:
//...
std::string _name;
//...
};
//Methods and fields shown here represent the exact same representative data as in A but the classes are so dissimilar as to not be considered "is-a" relationship.
(abstract data type)
class B {
public:
//...
std::string GetName();
std::string GetName() const;
void SetName(std::string name);
//...
protected:
//...
std::string _name;
//...
};
(concrete)
class C : public A, public B {
public:
//...
C(/*..Other parameters..*/, std::string name, /*....*/)
: A(name, /*...*/), B(name, /*...*/) {
/*...*/
}
//...
private:
//...
};