3

のコンストラクターはabstract classすべきではなくpublic、すべきですprotected。私の質問はその中のメソッドについてですabstract class。同じ理由で、それらを宣言できますpublicか、それとも宣言する必要がありますか?protected

4

3 に答える 3

10

abstract型に関するコンストラクターの正当性protectedは、派生型以外にコンストラクターを呼び出すことができるエンティティが他にないということです。publicこの場合、型階層の外部でコンストラクターを呼び出すことはできないため、コンストラクターを作成しても意味がありません。したがって、protected最も適切なアクセス修飾子として使用することをお勧めします。

同じロジックは、タイプの他のメンバーには当てはまりません。アクセス修飾子で許可されている場合は、型階層の外部から自由に呼び出すことができます。

public abstract class Dog {

  // Public is appropriate here as any consumer of Dog could access
  // Breed on an instantiated object
  public abstract string Breed { get; }

  // Public would be meaningless here. It's not legal to say 
  // 'new Dog' because 'Dog' is abstract. You can only say 
  // 'new Poodle' or 'new Bulldog'.  Only derived types like
  // Poodle or Bulldog could invoke the Dog constructor hence it's
  // protected
  protected Dog() { }
}

public class Poodle : Dog { } 
public class Bulldog : Dog { }

特定のメンバーが特定のAPIに依存する必要があるかどうか、またはpublic依存するかどうか。protected推論abstractは、非抽象型の場合とまったく同じである必要があります。

于 2012-05-01T16:53:34.840 に答える
6

意味がないため、抽象クラスには public コンストラクターを含めないでください。抽象クラスは不完全であるため、パブリック コンストラクター (誰でも呼び出すことができる) を許可しても、インスタンスをインスタンス化できないため機能しません。

抽象クラスのメソッドは別の話です。抽象クラスで実装することができます。これは、すべてのサブクラスが継承する動作です。Shape クラスを考えてみましょう。その目的は画面に図形を描画することなので、呼び出し元が Shape に描画を要求できるようにするため、Draw メソッドを public にすることは理にかなっています。メソッド自体を抽象化してサブクラスに実装を強制することも、オーバーライドを許可する場合と許可しない場合がある実装を提供することもできます。クラスの定義された動作がどうあるべきかによって異なります。

于 2012-05-01T16:54:28.707 に答える
5

ユースケースによって異なります。抽象クラスのメソッドを派生クラスのインスタンスから見えるようにする場合は、それらをパブリックにする必要があります。一方、メソッドを派生クラスだけに見えるようにしたい場合は、メソッドを保護する必要があります。

于 2012-05-01T16:54:07.133 に答える