2013-01-24 160 views

回答

2

是的,你可以,如果它被宣布为publicprotected。但不是private

感谢@DavidL ..我忘了提及internal的特殊情况。

从附带的Visual Studio(2012年版在这里)C#手册::

  • •继承是传递的。如果C来自B,并且B从A派生出 ,则C继承B中声明的成员以及A中声明的成员。•派生类扩展其直接基类 类。派生类可以向其继承的成员添加新成员,但它不能删除继承成员的定义。 •实例 构造函数,析构函数和静态构造函数不是继承的, ,但所有其他成员都是,无论它们声明的可访问性为 (§3.5)。但是,根据其声明的可访问性,继承的成员可能无法在派生类中访问。 •派生类 可以通过声明具有 相同名称或签名的新成员来隐藏(§3.7.1.2)继承成员。但请注意,隐藏继承的成员不会删除该成员 - 它只会使该成员 直接通过派生类无法访问。 • 类的实例包含一组在类中声明的所有实例字段,并且其基类中存在一个从 派生类类型到其任何基类类型的隐式转换(第6.1.6节)。因此,对某个派生类的实例的引用 可被视为对其任何基类的实例的引用。 •一个类可以声明虚方法,属性和索引器,并且派生类可以覆盖这些函数成员的实现。 这使类 呈现多态行为,其中由功能成员调用执行的动作取决于调用该功能成员的实例的运行时类型而变化。

而且这是一个新的隐藏特征,如果我的权利,在C#5.0:

嵌套类型可能隐藏(§3.7.1)的基体部件。新的修饰符在嵌套类型声明中是允许的,这样可以明确表示隐藏。示例

using System; 

class Base 
{ 
    public static void M() { 
     Console.WriteLine("Base.M"); 
    } 
} 
class Derived: Base 
{ 
    new public class M 
    { 
     public static void F() { 
      Console.WriteLine("Derived.M.F"); 
     } 
    } 
} 
class Test 
{ 
    static void Main() { 
     Derived.M.F(); 
    } 
} 

显示一个嵌套的类M,它隐藏了在Base中定义的方法M.

+0

不要忘记特殊情况下,国内也适用:) –

+0

Ofcourse @DavidL :-) –

+1

5.0中的方法隐藏并不新;从1.0(我相信)开始,如果不是,那么在2.0。 – Servy

0

是的,当你从一个类继承你得到它的所有方法,包括它从其他方面继承的所有方法。

1

这取决于。

  • 当A类的方法是私有的:没有
  • 当A类的方法是受保护:是
  • 当A类的方法是公开的:是
  • 当类中的方法A是公开的或者是受保护的并且是虚拟的,C类可以覆盖该方法。
+2

也可以谨慎的指出,如果方法是虚拟的,那么类B可以通过将类标记为“密封”来防止类C重写该方法。 – itsme86

0
public class A 
{ 
    public int Id { get; set; } 
    protected int protectedId { get; set; } 
    private int privateId; 
} 

public class B : A 
{ 
} 

public class C : B 
{ 
    public C() 
    { 
     int temp = Id; // works 
     int temp1 = protectedId; // works 
     int temp2 = privateId; // does NOT work 
    } 
} 

和其他一些类;

public void SomeMethod() 
{ 
    C c = new C(); 
    int i = c.Id; // works 
    int j = c.protectedId; // does NOT work 
    int k = c.privateId; // does NOT work 
}