web-dev-qa-db-ja.com

抽象クラスの保護コンストラクタとパブリックコンストラクタ?違いはありますか?

この質問は好奇心からです。違いはありますか?

public abstract class MyClass
{
    public MyClass()
    {
    }
}

そして

public abstract class MyClass
{
    protected MyClass()
    {
    }
}

ありがとう。

35
Marlon

それらはすべての実用的な目的で同じです。

しかし、違いを求めたので、私が考えることができる1つの違いは、リフレクションを使用してクラスのコンストラクターを検索している場合、一致するBindingFlagsが異なることです。

BindingFlags flags = BindingFlags.Public | BindingFlags.Instance;
var constructor = typeof(MyClass).GetConstructor(flags, null, new Type[0], null);

これにより、一方のケースではコンストラクターが見つかりますが、もう一方のケースでは見つかりません。

31
Mark Byers

抽象クラスにパブリックコンストラクターを含めるべきではありません。抽象型のコンストラクターは、派生型によってのみ呼び出すことができます。パブリックコンストラクターは型のインスタンスを作成し、抽象型のインスタンスを作成できないため、パブリックコンストラクターを使用した抽象型は正しく設計されていません。

詳細については、こちらをご覧ください http://msdn.Microsoft.com/en-us/library/ms182126.aspx

16
Shekhar_Pro

このコードの将来の使用に関しては、違いはありません。

2