2014-02-22 45 views
3

我想隱藏派生類中的訪問器,它有效嗎?我的系統在執行時沒有迴應。可派生類隱藏訪問器 - 以下代碼有什麼問題

class BaseCS 
    { 
     private string name; 

     public string Name 
     { 
      get { return name; } 
      set { name = "Base " + value; } 
     }  
    } 

    class DerivedCS : BaseCS 
    { 
     public new string Name 
     { 
      set { Name = "Der " + value; } 
      get { return Name; } 
     } 
    } 

public static void Main() 
     { 
      BaseCS one = new DerivedCS(); 

      one.Name = "One"; 

      Console.WriteLine("Name of object one is {0} ", one.Name); 


      ((BaseCS)one).Name = "On1"; 
      Console.WriteLine("Name of object one is {0} ", one.Name); 
     } 

不應該我期望輸出爲,

Name of object one is Base Der One 
Name of object one is Base On1 
+0

你爲什麼要使用新的這個?如果你想在C#中使用多態行爲,你可以使用虛擬的。 – Ikaso

回答

2
  1. 此代碼:

    public new string Name 
    { 
        set { Name = "Der " + value; } 
        get { return Name; } 
    } 
    

    會導致堆棧溢出,因爲在getter和setter方法將參照NameDerivedCS中的Name,而不是BaseCSName財產將永遠自稱,直到崩潰。您需要使用base.Name

  2. 你可能想要的是polymorphysm。您應該在派生類中創建屬性virtualoverride setter。

    如果你不使用的虛擬特性,以下對象將不會表現你所希望的方式:

    BaseCS one = new DerivedCS(); 
    one.Name = "name"; // base implementation is called 
    
  3. 在二傳手更改屬性值通常是一個壞主意。用戶期望要遵循以下合約:

    var a = new A(); 
    a.Foo = "bar"; 
    Debig.Assert(a.Foo == "bar"); 
    
0

這裏是你應該做的事情

class BaseCS 
    { 
     private string name; 

     public virtual string Name 
     { 
      get { return name; } 
      set { name = "Base " + value; } 
     } 

    } 

    class DerivedCS : BaseCS 
    { 
     public override string Name 
     { 
      set { base.Name = "Der " + value; } 
      get { return base.Name; } 
     } 
    } 

,或者用新的關鍵字

class BaseCS 
    { 
     private string name; 

     public string Name 
     { 
      get { return name; } 
     set { name = "Base " + value; } 
    } 

} 

class DerivedCS : BaseCS 
{ 
    public new string Name 
    { 
     set { base.Name = "Der " + value; } 
     get { return base.Name; } 
    } 
} 

now you should create the object as the derived type to get your expected result 

    DerivedCS one = new DerivedCS();