C#覆盖公共成员并将其设为私有

可能? 你能改变任何 东西的访问权限吗?

不,您可以在子类中使用私有方法隐藏公共成员,但不能使用子类中的私有成员覆盖公共成员。 而且,实际上,它不仅仅是公共/私人事物,这适用于缩小访问范围。

修订 :通过隐藏更严格的访问 – 在这种情况下是私有访问 – 您仍然可以从基类或子类引用中看到基类成员,但是当从新访问级别可用时它将遵循新方法。

因此,通常,当您隐藏时,隐藏在其访问级别可见时优先。 否则原始方法是使用的方法。

 public class BaseClass { public virtual void A() { } public virtual void B() { } } public class SubClass { // COMPILER ERROR, can't override to be more restrictive access private override void A() { } // LEGAL, you can HIDE the base class method, but which is chosen // depends on level accessed from private new void B() { } } 

所以SubClass.B()只有在可访问时才会隐藏基类方法。 也就是说,如果你在SubClass调用SubClass.B() ,那么它将采用B()的隐藏forms,但由于B()是私有的,它对于自身之外的类是不可见的,因此它们仍然看到BaseClass.B()

它的长短是:

1)您不能覆盖方法以限制更多(访问明智)。 2)您可以使用限制性更强的方法隐藏方法,但它只会在新的访问类型可见的情况下产生效果,否则基本方法就会显示。

 public class BaseClass { public virtual void A() { } public virtual void B() { } } public class SubClass : BaseClass { public virtual void A() { B(); } // legal, you can do this and B() is now hidden internally in SubClass, // but to outside world BaseClass's B() is still the one used. private new void B() { } } // ... SubClass sc = new SubClass(); BaseClass bc = new BaseClass(); // both of these call BaseClass.B() because we are outside of class and can't // see the hide SubClass.B(). sc.B(); bc.B(); // this calls SubClass.A(), which WILL call SubClass.B() because the hide // SubClass.B() is visible within SubClass, and thus the hide hides BaseClass.B() // for any calls inside of SubClass. sc.A(); 

不。

解决这个问题的一种典型方法是抛出NotImplementedException或其他东西。

您无法缩小或扩大覆盖成员的可见性。 但是,您可以使用new关键字定义另一个方法,该方法可以为您提供一个具有相同名称但在多态方面不兼容的新方法。

 public class A : B { public new void Foo() { base.Foo(); } }