为什么打印以下程序
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
答案 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()方法可以调用它,因为它可以看到它自己的类的其他方法,即使是私有的。