【问题标题】:How method hiding works in C#?方法隐藏如何在 C# 中工作?
【发布时间】:2010-10-17 02:54:42
【问题描述】:

为什么会打印以下程序

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

?

【问题讨论】:

  • 好棘手的场景。感谢分享。

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


【解决方案1】:

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

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

【讨论】:

    【解决方案2】:

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

    【讨论】:

      【解决方案3】:

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

      不过,在类中,新的 B.Print 方法仍然可见,所以它是由同一类中的方法调用的。

      【讨论】:

        【解决方案4】:

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

        【讨论】:

          【解决方案5】:

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

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

          【讨论】:

            猜你喜欢
            • 2010-10-17
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 2011-09-14
            • 1970-01-01
            • 1970-01-01
            • 2010-11-13
            • 1970-01-01
            相关资源
            最近更新 更多