abstract class と protectedコンストラクタ

どっちも継承することを考慮するクラスを定義するときに使う。
じゃあどういうときにどっちを使えばいいの?っていうことについて書いてく。

コードと使い方の違い

まずは abstract class から。

抽象的なものとして定義されたクラスは派生先のクラスからじゃないとインスタンスを生成できない。
絶対に。
たとえprotected Hoge(){ }public Hoge(){ }に書き換えても。

つぎは protected コンストラクタ。

抽象クラスじゃないFugaクラスは、コンストラクタさえ呼び出せるスコープからならインスタンス生成可能。
リフレクションでも可能。

使い分け

abstract class として定義されているのはたくさんある。
Typeクラス、KeyedCollection<TKey,TValue>クラスなどなど。
派生先に実装を委ねたいオブジェクトに使用される。

非抽象クラスでprotected コンストラクタでしか初期化できないクラスとしてはDynamicObject
他に思いつくものはないけどまだあるかもしれない。
できれば派生先でいくらか実装して使ってほしい。でも、どうしてもってことならそのままインスタンスを初期化していいよっていうニュアンスのクラスに使用される。

さっきリファレンス眺めてたら抽象クラスのDelegateクラスにstaticなメンバーが定義されてた。
普段その表現にどーも違和感があって避けてるけど、別に不自然なことじゃないのかもしれない。

About houzkin

Leave a comment


*