gpt4 book ai didi

C# 覆盖公共(public)成员并将其设为私有(private)

转载 作者:可可西里 更新时间:2023-11-01 08:20:06 26 4
gpt4 key购买 nike

可能吗?您可以将任何内容的访问权限更改为其他任何内容吗?

最佳答案

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

修订:通过使用更严格的访问权限隐藏 - 在本例中为私有(private)访问权限 - 您将仍然看到来自基类或子类的基类成员引用,但它会在新访问级别可用时遵从新方法。

所以一般来说,当您隐藏时,隐藏在其访问级别可见时优先。否则使用原始方法。

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() 是私有(private)的,它对自身以外的类不可见,因此它们仍然可以看到 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();

关于C# 覆盖公共(public)成员并将其设为私有(private),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7178486/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com