2010-10-29 59 views
5

这让我感到困惑,请将我的行为暴露给我?c#隐藏混淆

只有在新成员的范围内,新成员的声明隐藏了继承成员。 复印

**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 
}** 

在上面的例子,F的Derived中的声明隐藏从基地继承在F,但是由于新的F Derived中具有私有访问,其范围不扩展到MoreDerived。因此,MoreDerived.G中的调用F()是有效的,并且将调用Base.F.

我不理解的是如何static void G() { F(); }可以访问基类的方法F时,它可以访问所有的方法是直接超类和超类隐藏基类的方法F

+0

它不能调用'Derived :: F()',因为该方法是私有的。在Derived之外,Derived :: F()可能完全不存在。您可能需要稍微改变您的示例,除非这样做能够使所有工作都成功 - 在这种情况下,您可以得到答案。 – cHao 2010-10-29 05:50:22

回答

10

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

如果修饰符是protected而不是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 
    } 
} 
+0

更快的枪,猜测我不必完成我的段落。 :) +1 – GalacticJello 2010-10-29 05:50:31

+0

没关系,但如果更多的类可以访问基类的方法,当它不可用时,它的直接超类只是我的困惑 – NoviceToDotNet 2010-10-29 05:55:38

+0

@NoviceToDotNet:请参阅我的回答以获得您的上述评论 – TalentTuner 2010-10-29 06:01:35

1

“新”的关键字将隐藏基成员如果allowded是在类的外部访问。

但由于继承链MoreDerived:Derived:Base,您将看到immeditae base的公共成员或链中较高的基类。

方法隐藏不等于方法上的专用修饰符。

+0

请参阅隐藏意味着基类方法隐藏在派生类中NEW kwy字的派生类bcas中。现在它不能在外面的世界中获得。那么怎么才能让moreDerived类这只是我的问题 – NoviceToDotNet 2010-10-29 06:10:56

+0

由于继承链MoreDerived:Derived:Base,所以现在如果你隐藏了base的F方法派生并且使它更私密,所以在更多的被欺骗类中没有任何公开的它可以在它的直接父级(Derived)中看到,因此它在链上爬行并查看是否有其他类有F(),在你的情况下是的,它是Base,因此编译器使它对你有用。 – TalentTuner 2010-10-29 06:15:56

+0

但是我很疑惑,派生类可以看到它的直接超类,所以如何能更多的派生类可以去基类,请解释我先生 – NoviceToDotNet 2010-10-29 06:18:42