2

我的问题属于这种情况

class A
{
    public virtual void show()
    {
         Console.WriteLine("Hey! This is from A;");
    }
}
class B:A
{
    public sealed override void show()
    {
         Console.WriteLine("Hey! This is from B;");
    }
}
class C:B
{
    public new void show()
    {          
         Console.WriteLine("Hey! This is from C;");         
    }          
}

或者

class A
 {
      public  void show()
      {
           Console.WriteLine("Hey! This is from A;");
      }
 }
 class B:A
 {
      public new void show()
      {
               Console.WriteLine("Hey! This is from B;");
      }
 }

在上面的代码中 C 类隐藏了 B 类的方法 Show()

问:我如何确定没有 Subclass Override以及已经在 SuperClass 中定义的Hides方法

像这样的东西或可能readonly是用于字段的关键字

 class A1
 {
      public sealed void show() // I know it will give compilation error
      {
           Console.WriteLine("Hey! This is from A1");
      }
 }
 class B1 : A1
 {
      public void show()
      {
           Console.WriteLine("You must get a compilation Error if you create method with this name and parameter");
      }
 }

有没有这样的关键词?

编辑1:

是的,我想阻止扩展器确保它使用带有方法名称和参数 coz 的正确实现,如果其他人查看代码它应该是正确的

4

2 回答 2

12

防止出现隐藏方法的子类的唯一方法是创建 class sealed,从而防止任何子类。如果可以有任何子类,那么它们可以隐藏该方法,而您对此无能为力。

于 2013-09-20T18:55:14.180 回答
0

如果您依赖A并且B没有覆盖他们的方法,sealed那么这项工作就完成了。如果您希望防止方法隐藏,请确保所有需要A或继承者的成员都定义为AB

考虑以下:

A a = new A();
a.show(); // "Hey! This is from A;"

A a = new B();
a.show(); // "Hey! This is from B;"

B b = new B();
b.show(); // "Hey! This is from B;"

A a = new C();
a.show(); // "Hey! This is from B;"

B b = new C();
b.show(); // "Hey! This is from B;"

只有当您引用Cas时,关键字C才会new生效。

C c = new C();
c.show(); // "Hey! This is from C;"

总而言之,您的实现应该只使用定义Aand Bas Aor的实例B。事实上,除非C在你的程序集中实现了类似的东西,否则你的代码不能被强制调用C's public new void show()

于 2013-09-20T19:24:34.330 回答