防止覆盖/隐藏方法c#的任何子类;保留超类的方法签名

时间:2013-09-20 18:52:46

标签: c# oop

我的问题属于这种情况

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;");         
    }          
}

OR

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类的Method Show()

  

Q值。我如何确定没有子类覆盖以及隐藏方法   已在SuperClass中定义

类似这样或可能类似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实现   查看代码应该是正确的

2 个答案:

答案 0 :(得分:13)

防止存在隐藏方法的子类的唯一方法是创建类sealed,从而阻止任何子类。如果可以有任何子类,那么他们可以隐藏方法,你无能为力。

答案 1 :(得分:0)

如果您依赖AB没有覆盖他们的方法,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;"

只有当您将C称为C时才会启用new关键字。

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

总之,您的实现应仅使用AB的实例定义AB。实际上,除非在程序集中实现C之类的内容,否则不能强制您的代码调用C的{​​{1}}。