web-dev-qa-db-ja.com

抽象クラスのコンストラクターをパブリックではなく保護する必要があるのはなぜですか?

ReSharperは、publicクラスのabstractコンストラクターのアクセシビリティをprotectedに変更することを提案していますが、その背後にある理論的根拠については述べていません。

光を当てることができますか?

44

公開されているという理由だけで、抽象クラスでは意味がありません。定義上、抽象クラスを直接インスタンス化することはできません。派生型のインスタンスによってのみインスタンス化できます。したがって、コンストラクターにアクセスする必要がある唯一の型はその派生型であり、したがって保護はパブリックよりもはるかに理にかなっています。アクセシビリティをより正確に説明します。

79
JaredPar

抽象クラスでコンストラクターをpublicではなくprotectedにした場合、技術的には何の違いもありません。コンストラクターのアクセシビリティ/可視性はまったく同じです。同じクラスまたは派生クラスです。 2つのキーワードは、すべての意図と目的に対して区別できない効果をもたらします。

したがって、この選択はスタイルの問題にすぎません。オブジェクト指向に精通した人々を満足させるには、protectedと入力します。


Reflectionには、デフォルトでpublicの場合にのみコンストラクターが含まれますが、とにかくそのコンストラクターを呼び出すことはできません。

IntelliSenseは、publicと入力するとnewコンストラクターを表示しますが、とにかくそのコンストラクターを呼び出すことはできません。

アセンブリのメタデータは、コンストラクターがパブリックまたは保護されているという事実を反映します。