c#隐藏混乱

c#隐藏混乱,c#,C#,这让我很困惑,请解释一下这种行为 新成员的声明仅在新成员的范围内隐藏继承的成员。 抄袭 在上面的示例中,派生中的F声明隐藏了从Base继承的F,但是由于派生中的新F具有私有访问权限,因此其范围不扩展到moreDerivated。因此,MoreDerived.G中的调用F()是有效的,将调用Base.F. 我不明白当static void G(){F();}可以访问其直接超类的所有方法时,它如何访问基类F方法,而超类隐藏了基类的F方法MoreDerived无法访问其超类的所有方法;特别是,它不能访

这让我很困惑,请解释一下这种行为

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

在上面的示例中,派生中的F声明隐藏了从Base继承的F,但是由于派生中的新F具有私有访问权限,因此其范围不扩展到moreDerivated。因此,MoreDerived.G中的调用F()是有效的,将调用Base.F.


我不明白当
static void G(){F();}
可以访问其直接超类的所有方法时,它如何访问基类F方法,而超类隐藏了基类的F方法

MoreDerived
无法访问其超类的所有方法;特别是,它不能访问
私有
方法。在C#中,类中标记为
private
的任何内容对于该类之外的任何内容都是不可见的。换句话说,添加或删除
private
方法不会改变该类之外的任何东西的编译方式。由于外部世界看不到新的私有静态无效空间F,
更多派生的
不受其影响

如果修改器被
保护
,则
更多派生的
将看到它

在您给出的示例中,
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
    }
}

如果允许基本成员在类之外访问,“new”关键字将隐藏该基本成员

但是由于继承链MoreDerived:Derived:Base,您将在该链中看到immeditae Base的公共成员或更高的基类


方法隐藏不等于方法上的私有修饰符。

它不能调用
派生的::F()
,因为该方法是私有的。在
派生的
之外,
派生的::F()
可能根本不存在。你可能需要稍微改变一下你的例子,除非这能让一切顺利——在这种情况下,你有你的答案+1这没关系,但是当基类方法不可用于仅属于我的直接超类时,MoreDerivated类如何能够访问基类方法confusion@NoviceToDotNet:查看我的答案,了解您的上述评论。DotNet:如果您看到我的编辑,则
Base
F
方法仍然可供
Derived
访问,只是没有限定。但这里我没有使用任何限定
static void G(){F();}
,因此如何访问基类方法非常令人困惑,先生,请解释mesee隐藏意味着基类方法隐藏在派生类bcas中,就像派生类中的新kwy单词一样。现在外面的世界是不可能接触到它的。那么这对moreDerived类如何可用呢?这只是我的问题,因为继承链moreDerived:Derived:Base,所以现在如果在Derived中隐藏Base的F方法并使其私有,那么在更详细的类中,它在其直接父类(Derived)中看不到任何公共的东西因此,它沿着链向上爬,看看是否有其他类有F(),在您的例子中是的,它是Base,所以编译器使它对您可用。但是我有一点困惑,派生类可以在它的直接超类中看到它,所以MoreDerivated类如何才能进入基类请解释先生
MoreDerivated
可以从
base
Derivated
访问静态方法。当它访问
F
时,它获取从
派生的
继承的,这是从
Base
继承的
F
,因为
派生。F
是私有的。因此,我的结论是,在派生类中,两种方法都可用,但prviate关键字限制了派生类方法的访问,但基类方法继承到了更多派生类m。我正确吗?但是我不清楚在派生类中使用新关键字进行跟踪的需要是什么,我想知道在任何情况下我们都会进行跟踪。如果我从派生类方法中删除private,那么MoreDerivated将可以访问基类和派生类的方法请解释一下
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
    }
}