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