2014-09-23 64 views
1

我無法在派生類中訪問im.i不起作用。爲什麼?無法在派生類中訪問變量

public class MyClass 
    { 
     protected int i; 
     public MyClass() 
     { 

     } 

     public virtual void Display() 
     { 
      Console.WriteLine("Base dis"); 
     } 
    } 

    public class MyCla : MyClass 
    { 
     public MyCla() 
     { 


     } 
     int ij = 12; 
     public new void Display() 
     { 
      MyClass m = new MyClass(); 
      // m.i is inaccessible here 
      Console.WriteLine("Derived dis"); 
     } 
    } 

回答

4

這是因爲protected變量和屬性只提供給派生類,派生上下文中(從而通過與this引用它),並以當前的類的實例(因此,如果mMyCla它將有工作)。

MyCla m = new MyCla(); 
int x = m.i; 

一種選擇是讓現場internal,或protected internal如果你願意,這使得它可用於在組件中的所有類。

這是compiling example

+0

護理解釋downvote? – 2014-09-23 09:13:22

+2

@Default OP在派生類中的方法中對MyClass進行了類型化,而不是MyCla。 – Kapol 2014-09-23 09:26:06

+0

@PatrickHofman:對不起,這對我的想法看起來不合邏輯(不是你學到的東西,而是這種程序邏輯思想)。直到5年的編程日期爲止,我的假設是我可以這樣訪問它,這就是Protected的含義。但奇怪的是,受保護訪問的定義和它的行爲看起來相差180度。 – Learner 2014-09-23 09:42:50

0

「受保護」關鍵字表示只有從該類型派生的類型和類型才能訪問成員。

,如果你希望能夠訪問該成員

  • 設爲公開你有幾個選項。
  • 使其內部。這將允許任何類型相同的組件內訪問的成員(或其他組件時,應當在添加好友的

乾杯

0

您正在創建一個新的實例:僅

MyClass m = new MyClass(); 

此實例允許你與公衆成員進行交互,因此mi不起作用

在你的派生類MyCla類中,但是你有權訪問受保護的字段

e.g

public new void Display() 
{ 
      i = 1; //this will work 
} 
+0

男人,我怕你說什麼。你編譯了它嗎?我聲稱它應該工作,但它不工作,但你說它必須工作。 – Learner 2014-09-23 09:36:02

+0

在Display方法中,您可以從派生類訪問該字段。但是你正在創建一個新實例,然後嘗試訪問該字段。刪除行MyClass m = new MyClass(),你會看到你可以訪問私人領域。 – Postlagerkarte 2014-09-23 09:43:01

+0

您可能想要運行並查看。謝謝。問題不是私人的,而是受保護的。 – Learner 2014-09-23 09:47:26

-1

您可以從MyCla類中,但在你的方法「顯示」您正在創建一個新的MyClass的對象來訪問我,因此它無關MyCla可言了。

下面是如何訪問變量「i」的代碼實例:

public class MyClass 
{ 
    protected int i; 
    public MyClass() 
    { 

    } 

    public virtual void Display() 
    { 
     Console.WriteLine("Base dis"); 
    } 
} 

public class MyCla : MyClass 
{ 
    public MyCla() 
    { 
    } 

    int ij = 12; 

    public new void Display() 
    { 
     Console.WriteLine(this.i); 
    } 
} 
0

你不能在子類中受保護的變量,但是,這將是在子類中的方法或直接構造例如訪問。 base.i;

public class MyCla : MyClass 
{ 
    public MyCla() 
    { 
     base.i=100; 
    } 
    int ij = 12; 
    public new void Display() 
    { 
     MyClass m = new MyClass(); 
     base.i=100; // Accessible 
     m.i = 100; // Not Accessible 
     Console.WriteLine("Derived dis"); 
    } 
} 

如果你想讓這個變量可以通過對象訪問,那麼將它變成公共的。

public int i; 
public MyClass() 
{ 

} 

public class MyCla : MyClass 
{ 
    public MyCla() 
    { 


    } 
    int ij = 12; 
    public new void Display() 
    { 
     MyClass m = new MyClass(); 
     m.i = 100; // accessible 
     Console.WriteLine("Derived dis"); 
    } 
} 

感謝

+0

謝謝,但編程的想法吸了。我不同意了,它不合邏輯。爲什麼HECK應該可以用「Base」而不是「Object」訪問。 MSDN在構造他們的句子或定義繼承和受保護的訪問方面存在一些混淆。我在編程的5年之前,認爲保護手段,我可​​以在派生類訪問。哎呀,這對我和微軟來說都是一種恥辱,當我在VS控制檯中學習時,它的表現會有所不同。 – Learner 2014-09-23 09:41:46