gpt4 book ai didi

C# 隐藏困惑

转载 作者:太空狗 更新时间:2023-10-29 22:24:36 25 4
gpt4 key购买 nike

这让我感到困惑,请解释一下这个行为?

新成员的声明仅在新成员的范围内隐藏继承的成员。复制

**class Base
{
public static void F() {}
}
class Derived: Base
{
new private static void F() {} // Hides Base.F in Derived only
}
class MoreDerived: Derived
{
static void G() { F(); } // Invokes Base.F
}**

在上面的例子中,Derived中F的声明隐藏了继承自Base的F,但是由于Derived中新的F具有私有(private)访问权限,它的作用域并没有扩展到MoreDerived。因此,MoreDerived.G 中的 F() 调用是有效的并将调用 Base.F。

我不明白 static void G() { F(); 当它可以访问它的直接父类(super class)的所有方法并且父类(super class)隐藏了基类的 f 方法时,它可以访问基类 f 方法

最佳答案

MoreDerived 无法访问其父类(super class)的所有 方法;特别是,它不能访问 private 方法。在 C# 中,类中任何标记为 private 的内容对该类之外的任何内容都是不可见的。换句话说,添加或删除 private 方法不会改变该类之外的任何内容的编译方式。由于 new private static void F 对外界不可见,因此 MoreDerived 不受其影响。

如果修饰符被保护MoreDerived 看到它。

在您给出的示例中,new 关键字仅更改命名空间中名称的含义。它不会改变可用的方法。 Derived 的方法仍然可以像这样调用 Base.F():

class Derived: Base 
{
new private static void F()
{
F(); // calls Derived.F()
Base.F(); // calls Base.F()
}
}

class MoreDerived: Derived
{
static void G()
{
F(); // Invokes Base.F
Derived.F(); // Invokes Base.F because Derived.F is private
Base.F(); // Invokes Base.F
}
}

类似于这个例子:

class Foo
{
int bar; // in most methods, this variable can be accessed as just "bar"

Foo(int bar) // this parameter will hide the instance member bar
{
this.bar = bar; // instance method can still be accessed, though
}
}

关于C# 隐藏困惑,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4049277/

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