2013-01-24 81 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 
}