12

パブリックコンストラクターを持つパブリック抽象クラスと、保護されたコンストラクターを持つパブリッククラスの違いは何ですか。抽象クラスには抽象関数はありませんが、プログラマーがそのクラスを拡張するオブジェクトのみを作成できるようにする必要があります。

どちらのシナリオもコンパイルして機能しますが、どちらをどのシナリオで使用するのがよいかわかりません。抽象クラスを直接インスタンス化することはできませんが(非抽象子クラスを介してのみ)、抽象クラスには通常、そのクラスの子によって実装する必要のある抽象関数が含まれている必要があることを理解しました。

パブリッククラスに保護されたコンストラクターがない場合は、このクラスのインスタンス化が不可能であることを意味します(これが私たちが持っている唯一のコンストラクターです)。

4

4 に答える 4

10

MSDNはabstract、クラスのキーワードの使用について次のように述べています。クラス宣言でabstract修飾子を使用して、クラスが他のクラスの基本クラスのみを対象としていることを示します。つまり、抽象クラスに抽象メンバーが含まれている必要はありません。修飾子は、abstractコンストラクターを公開しないようにするなどの技術的な障害ではなく、クラスをインスタンス化してはならないことを明示的に示す方法です。

あなたが説明した技術的な障害には警告さえあることに注意してください:それはまだ呼び出すことができます:

  • 派生クラスから呼び出すことができます。
  • リフレクションを使用して呼び出すことができます。

どちらも、あなたのクラスを(ab-?)使用している他の開発者が、あなたが意図していなかったこと、つまりクラスをインスタンス化できることを意味します。

したがって、答えは、クラスをとしてマークする必要があるということですabstract

それでも、抽象クラスのコンストラクターを保護することをお勧めします(クラスをインスタンス化できないことを強調するため)。FxCopなどのツールは、抽象クラスにパブリックコンストラクターがある場合に警告を出力します。

これは、各メンバーを実際に必要なだけ表示するという一般的なルールに準拠しています。抽象クラスでは、コンストラクターがパブリックスコープから呼び出されることはないため、public可視性は必要ありません。これらは派生クラスのコンストラクターによってのみ呼び出されるためprotected、抽象クラスのコンストラクターの妥当な可視性も同様です。

したがって、抽象クラスのコンストラクターも作成します(最大で)protected

于 2012-07-17T20:45:38.987 に答える
6

保護されたコンストラクターを使用してパブリック抽象クラスを作成します。

を使用abstractすると、それが本当に抽象クラスであることが明らかになります。ただのprotectedコンストラクターはそれほど明確ではありません。

サブクラス以外はabstractコンストラクターを呼び出すことができません。放っておくのはちょっと意味がないpublic

于 2012-07-17T20:43:59.913 に答える
4

プライベートまたは保護されたコンストラクターは、宣言クラスの静的メソッドから引き続き呼び出すことができます。抽象クラスには、インスタンス化する派生クラスが必要です。たとえば、シングルトンパターンは、パブリック静的メソッド/プロパティを介して呼び出されるプライベートコンストラクターを利用します。

于 2012-07-17T20:45:50.983 に答える
0

保護されたコンストラクターまたは内部コンストラクターを持つパブリック抽象クラスは、呼び出し元のコードでそれをどのように使用するかを伝えます。アクセスできないコンストラクターを使用すると、実際には混乱する可能性があります。

于 2012-07-17T20:46:26.163 に答える