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 方法的任何能力,因为它现在默认为. Main 不再可以访问它。new Print()Mainprivate

剩下的唯一选择是退回到从 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 中可用的公共方法(因为 b继承 a 并且 a 仍然有 Print 作为公共)

于 2009-04-02T13:38:22.433 回答
1

如果没有 public 关键字,则该方法是私有的,因此不能由 Main() 调用。

但是 Print2() 方法可以调用它,因为它可以看到自己类的其他方法,即使是私有的。

于 2009-04-02T13:39:04.240 回答