4

ここを見てください (抽象クラス設計): http://msdn.microsoft.com/en-us/library/ms229047.aspx

それは言います:

(1) public または protected internal (Visual Basic では Protected Friend) コンストラクターを抽象型で定義しないでください。

C# では、抽象クラスをインスタンス化できません。では、C# で抽象クラスのパブリック コンストラクターを定義することは依然として重要なのでしょうか? それとも、セマンティックな意味のために、抽象クラスのパブリック コンストラクターを作成していませんか?

また、次のようにも述べています。

(2) 抽象クラスで保護されたコンストラクターまたは内部コンストラクターを定義してください。

内部コンストラクターを定義する ?? (1)では、内部保護されたコンストラクターを定義しないのは、「パブリックまたは保護された内部可視性を持つコンストラクターは、インスタンス化できる型用である」ためであることがわかります。抽象クラスの内部コンストラクターを定義すると、(1) の規則が破られませんか?

前もって感謝します。:)

4

3 に答える 3

6

それぞれのケースを見てみましょう。

おすすめされた:

  • protected - 最も明白なケース - すべてのサブクラスは、それらが存在するアセンブリに関係なく、コンストラクターを呼び出すことができます (抽象基本クラス自体がそれらに見える限り)。

  • internal - 抽象型をパブリックに表示したいが、パブリックに継承できないようにする場合に便利です。この場合、すべての非プライベート コンストラクターを作成する必要がありますinternal抽象基本クラスと同じアセンブリ内のサブクラスのみがコンストラクターを呼び出すことができます。事実上、それらのみが継承できます。別の使用例は、同じアセンブリのサブクラスにのみ表示される「特別な」コンストラクターが必要な場合です。

  • private - 主に、コンストラクター チェーンを使用するときに、抽象クラスの他のコンストラクターの対象となる「ダーティ ワーク」コンストラクターに使用されます。すべてのコンストラクターがプライベートである場合の他の唯一の使用法は、包含型のプライベート メンバーにアクセスできる、入れ子になったクラスによるサブクラス化のみを許可することです。


非推奨:

  • public - 役に立ちません。と同じように動作しprotectedます。基本クラスは抽象クラスであるため、サブクラスのみがコンストラクターを呼び出すことができます。

  • 保護された内部- これも と違いはありませんprotected。アクセシビリティ レベルは、保護された OR 内部を意味し、protected internal保護された AND 内部ではありません。ただし、internalここでの修飾子は目的を果たしません。アセンブリの外部にあるサブクラスがコンストラクターを呼び出すことを妨げprotectedません (抽象基本クラスがパブリックであると仮定します)。アクセスに依存できるためです。それを呼び出すサブクラスではありません(型は抽象です)。

ここでの重要なポイントはprivate、抽象クラス内のすべての非コンストラクターは、すでに最高の状態 protectedにあるということです。バニラinternal修飾子は、誰がコンストラクターを呼び出すことができるかについての制限を強化します。制限を弱めているように見えるため、何も達成publicしませんが、実際にはそうすることに成功していません.protected internal

于 2010-11-29T15:42:26.180 に答える
0

n C# では、抽象クラスをインスタンス化できません。では、C# で抽象クラスのパブリック コンストラクターを定義することは依然として重要なのでしょうか? または、抽象クラスのパブリックコンストラクターを作成しないのは、セマンティックな意味のためですか?

丁度。アクセス可能なコンストラクターをユーザーに見せたくないのですが、呼び出したときにコンパイル エラーが発生します。

内部コンストラクターを定義する ?? (1)では、内部保護されたコンストラクターを定義しないのは、「パブリックまたは保護された内部可視性を持つコンストラクターは、インスタンス化できる型用である」ためであることがわかります。抽象クラスの内部コンストラクターを定義すると、(1) の規則が破られませんか?

ルール 1 は約publicであり、protected internalルール 2 はprotectedおよびについてであると思いますinternal。したがって、両者の間に交差点はありません。

于 2010-10-26T09:38:14.360 に答える