1

前の質問で尋ねたように、コンストラクターは子クラスに継承されないことがわかっているので、 ここをクリックして質問を表示します

私はコードを書いていました

namespace TestConscoleApplication
{
    abstract public class A
    {
       public int c;
       public int d;

    private  A(int a, int b)
       {
           c = a;
           d = b;

       }
        public virtual void Display1()
        {
            Console.WriteLine("{0}{1}", c, d);
        }
    }
    internal class B : A 
    {
      protected  string Msg;

      public B(string Err)

        {
            Msg = Err;

        }

        public  void Display()
        {
            Console.WriteLine(Msg);
        }
    }



    class Program
    {
        static void Main(string[] args)
        {
            B ObjB = new B("Hello");


            Console.ReadLine();
        }
    }
}

コードをコンパイルすると、エラーが表示されます

TestConscoleApplication.A.A(int, int)保護レベルが原因でエラーにアクセスできません。

次に、なぜエラーが表示されているのか。

4

4 に答える 4

4

privateの唯一のコンストラクターを作成することにより、A派生クラスを外部で構築できないようにしましたA

于 2012-06-30T10:31:37.340 に答える
1

派生クラスコンストラクターは、常に基本コンストラクター(の1つ)を呼び出します。プライベートにすると、外部からのアクセスが禁止されます。つまり、AのインスタンスをAの外に作成することを不可能にします。

コンストラクターを作成したため、コンパイラーはこのクラスのデフォルトのパブリックコンストラクターを生成しません。

クラスの子孫からのアクセスを提供したいが、外部からのアクセスを提供したくない場合は、保護する必要があります。

于 2012-06-30T10:33:04.517 に答える
0

Aにアクセスして使用するためのコンストラクターが必要ですB。また、デフォルトの基本コンストラクターはbase()(つまり、パラメーターなしのコンストラクター)であり、には存在しませんA。これを解決する方法の1つは次のとおりです(不要なビットは削除されています)。

abstract public class A
{
    protected A(int a, int b)
    {
    }
}
internal class B : A
{
    public B(int a, int b, string Err)
        : base(a, b)
    {
    }
}
于 2012-06-30T10:35:14.923 に答える
-1

コンストラクターはプライベートであってはなりません。プライベートでない場合、そのクラスのインスタンスを作成できず、それを継承することもできませんが、プライベートコンストラクターを作成する場合は、それを使用してパブリックコンストラクターも作成してください。詳細についてはこちらをご覧ください

于 2012-06-30T10:33:48.427 に答える