のコンストラクターはabstract
class
すべきではなくpublic
、すべきですprotected
。私の質問はその中のメソッドについてですabstract
class
。同じ理由で、それらを宣言できますpublic
か、それとも宣言する必要がありますか?protected
3 に答える
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
は、非抽象型の場合とまったく同じである必要があります。
意味がないため、抽象クラスには public コンストラクターを含めないでください。抽象クラスは不完全であるため、パブリック コンストラクター (誰でも呼び出すことができる) を許可しても、インスタンスをインスタンス化できないため機能しません。
抽象クラスのメソッドは別の話です。抽象クラスで実装することができます。これは、すべてのサブクラスが継承する動作です。Shape クラスを考えてみましょう。その目的は画面に図形を描画することなので、呼び出し元が Shape に描画を要求できるようにするため、Draw メソッドを public にすることは理にかなっています。メソッド自体を抽象化してサブクラスに実装を強制することも、オーバーライドを許可する場合と許可しない場合がある実装を提供することもできます。クラスの定義された動作がどうあるべきかによって異なります。
ユースケースによって異なります。抽象クラスのメソッドを派生クラスのインスタンスから見えるようにする場合は、それらをパブリックにする必要があります。一方、メソッドを派生クラスだけに見えるようにしたい場合は、メソッドを保護する必要があります。