59

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

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

4

3 に答える 3

97

public であることは抽象クラスでは意味がないからです。定義上、抽象クラスは直接インスタンス化できません。派生型のインスタンスによってのみインスタンス化できます。したがって、コンストラクターにアクセスできる唯一の型はその派生型であるため、public よりも protected の方がはるかに理にかなっています。アクセシビリティをより正確に説明します。

于 2009-04-17T19:33:30.623 に答える
20

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

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


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

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

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

于 2013-03-18T14:24:07.247 に答える
-2

それは良い OO の練習です。

public abstract class ExampleAbstractClass
{
    protected ExampleAbstractClass()
    {
      // :::
    }
}

継承する子クラスのみがコンストラクターにアクセスできるようにする必要があります。これを行う唯一の方法は、コンストラクターを保護することです。
これらのコンストラクターにパラメーターを追加する場合は、まったく別の議論になることに注意してください。

于 2009-04-17T19:39:38.300 に答える