C# · 12月 23, 2021

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()的隐藏形式,但是由于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();