8

次のプログラムが印刷される理由

B
B

(そうあるべきです)

public class A
    {
        public void Print()
        {
            Console.WriteLine("A");
        }
    }

    public class B : A
    {
        public new void Print()
        {
            Console.WriteLine("B");
        }

        public void Print2()
        {
            Print();
        }
    }

    class Program
    {
        static void Main(string[] args)
        {
            var b = new B();
            b.Print();
            b.Print2();
        }
    }

しかし、次のようにクラスBのキーワード「public」を削除すると、次のようになります。

    new void Print()
    {
        Console.WriteLine("B");
    }

印刷を開始します

A
B

4

5 に答える 5

20

publicアクセス修飾子を削除すると、Bのメソッドを呼び出す機能new Print()が関数から削除されます。Mainこれは、デフォルトで。になっているためprivateです。Mainにはアクセスできなくなりました。

残っている唯一のオプションは、Aから継承されたメソッドにフォールバックすることです。これは、アクセス可能な唯一の実装であるためです。別のBメソッド内からPrint()を呼び出すと、Bのメンバーにプライベート実装が表示されるため、B実装が取得されます。

于 2009-04-02T13:37:11.420 に答える
5

Printメソッドを作成しているので、使用可能なメソッドは継承されたメソッドprivateのみです。Print

于 2009-04-02T13:37:58.330 に答える
3

外部的には、新しいB.Print()メソッドは表示されなくなったため、A.Print()が呼び出されます。

ただし、クラス内では、新しいB.Printメソッドが引き続き表示されるため、同じクラスのメソッドによって呼び出されます。

于 2009-04-02T13:38:03.150 に答える
2

クラスbからキーワードpublicを削除すると、新しいprintメソッドはクラス外では使用できなくなります。したがって、メインプログラムからb.printを実行すると、実際にはAで使用可能なpublicメソッドが呼び出されます(bを継承し、まだパブリックとして印刷されています)

于 2009-04-02T13:38:22.433 に答える
1

publicキーワードがないと、メソッドはprivateであるため、Main()で呼び出すことはできません。

ただし、Print2()メソッドは、プライベートであっても、独自のクラスの他のメソッドを参照できるため、このメソッドを呼び出すことができます。

于 2009-04-02T13:39:04.240 に答える