リファクタリング―プログラムの体質改善テクニック
![]() | リファクタリング―プログラムの体質改善テクニック マーチン ファウラー (2000/05) ピアソンエデュケーション この商品の詳細を見る 正誤表はこちら |
オブジェクト指向における再利用のためのデザインパターンがプログラマの共通語彙としての「デザインパターン」を確立した書籍だとすると、 Martin Fowler氏のファクタリング―プログラムの体質改善テクニックは「リファクタリング」という共通語彙を確立させた歴史的な名著ということになります。
本書はJavaの本ではありますが、リファクタリングの本質は特定のプログラミング言語に限ったものではありません。GoF本と共に全てのプログラマ必読の書です。
派生禁止クラス
Problem
あるクラスの派生を禁止したい場合、どのようにすれば良いでしょうか?
Solution
次のコードを見てください。
答えは簡単です。publicコンストラクタをprivateコンストラクタに変更します。
これで派生クラスからは基底クラスのコンストラクタが呼び出せなくなり、その結果、派生クラスではコンパイルエラーが引き起こされます。
よって、FinalClassにCreation Methodを追加します。
あるクラスの派生を禁止したい場合、どのようにすれば良いでしょうか?
Solution
次のコードを見てください。
class FinalClass {
public:
FinalClass() {}
};
int main()
{
FinalClass object;
return 0;
}
通常、FinalClassを継承することで派生クラスを作成できます。
class FinalClass {
public:
FinalClass() {}
};
class DerivedClass : public FinalClass {
public:
DerivedClass() {}
};
このような派生クラスを禁止したい場合、どのようにすれば良いでしょうか?答えは簡単です。publicコンストラクタをprivateコンストラクタに変更します。
これで派生クラスからは基底クラスのコンストラクタが呼び出せなくなり、その結果、派生クラスではコンパイルエラーが引き起こされます。
class FinalClass {
private:
FinalClass() {}
};
class DerivedClass : public FinalClass { // error!
public:
DerivedClass() {}
};
しかし、これだけではFinalClassのインスタンス化が行えません。よって、FinalClassにCreation Methodを追加します。
class FinalClass {
public:
static FinalClass createInstance() { return FinalClass(); }
private:
FinalClass() {}
};
int main()
{
FinalClass object = FinalClass::createInstance();
return 0;
}

