方法隐藏如何在C#中起作用?

时间:2009-04-02 13:34:55

标签: c# inheritance compiler-construction method-hiding

为什么打印以下程序

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

5 个答案:

答案 0 :(得分:20)

当您移除public访问修饰符时,您删除了从new Print()函数调用B的Main方法的任何功能,因为它现在默认为private。 Main已无法访问。

唯一剩下的选择是回退到从A继承的方法,因为这是唯一可访问的实现。如果您要从另一个B方法中调用Print(),您将获得B实现,因为B的成员将看到私有实现。

答案 1 :(得分:5)

您正在使用Print方法private,因此唯一可用的Print方法是继承方法。

答案 2 :(得分:3)

在外部,新的B.Print() - 方法不再可见,因此调用A.Print()。

在类中,新的B.Print方法仍然可见,因此是同一类中的方法调用的方法。

答案 3 :(得分:2)

当您从类b中删除关键字public时,新的打印方法在类外不再可用,因此当您从主程序执行b.print时,它实际上会调用A中提供的公共方法(因为b继承了a,而且仍然有Print作为公共)

答案 4 :(得分:1)

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

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