2009-02-13 44 views
4

是否有可能做這樣的事情?是否有可能通過重寫它來將訪問器添加到.NET中的屬性?

class A 
{ 
    public virtual string prop 
    { 
     get 
     { 
      return "A"; 
     } 
    } 
} 
class B: A 
{ 
    private string X; 
    public override string prop 
    { 
     get 
     { 
      return X; 
     } 
     set 
     { 
      X = value; 
     } 
    } 
} 

也就是說,基類提供了虛擬財產,只有get訪問,但在子類覆蓋GET和還提供了一組。

當前的例子不能編譯,但也許我在這裏錯過了一些東西。

加:澄清,不,我不想用新的重新定義。我想添加一個新的訪問器。我知道它不在基類中,所以它不能被覆蓋。好的,讓我試着解釋它沒有語法糖後的外觀:

class A 
{ 
    public virtual string get_prop() 
    { 
      return "A"; 
    } 
} 
class B: A 
{ 
    private string X; 
    public override string get_prop() 
    { 
     return X; 
    } 
    public virtual string set_prop() 
    { 
     X = value; 
    } 
} 
+0

重新編輯 - 簡單的答案是否定的:你不能。 – 2009-02-13 11:23:22

+0

在你的答案中編輯這個,我會接受它。 :) – 2009-02-13 11:28:23

回答

1

不,這是不可能的。不幸的是,您甚至無法覆蓋和更改訪問者級別(例如,從受保護的變爲公開),如在MSDN上記錄的那樣。我建議您考慮稍微重構代碼/類,並尋找替代方法來完成此任務,例如在派生類中使用SetProperty方法聲明設置訪問器的保護修飾符。

1

不,沒有辦法做到這一點。想想你如何虛擬財產的語法糖已經被處理,即它被轉換爲:

public virtual string get_prop(); 

沒有set_Prop方法重寫,並不能覆蓋一個不存在的方法。

+0

是的,但我可以添加一個新的虛擬方法,對吧? – 2009-02-13 11:09:26

0

您可以在派生類中使用'new'關鍵字隱藏基類實現。以下應該成功編譯:

class A 
{ 
    public virtual string prop 
    { 
     get 
     { 
      return "A"; 
     } 
    } 
} 
class B : A 
{ 
    private string X; 
    public new string prop 
    { 
     get 
     { 
      return X; 
     } 
     set 
     { 
      X = value; 
     } 
    } 
} 
0

引入一個新的領域麻煩雜亂。無論哪種方式,您都需要小心,不要破壞多態性和繼承(如果基類與私有領域對話呢?)。

關於在重寫時添加新的訪問器;簡單的答案是「不,你不能」。當你重寫時,你只能影響現有的訪問器,因爲這是成員的虛擬表中定義的內容(重寫的成員仍然由base /聲明類「擁有」,而不是重寫類)。

一個選項(不理想)是重新聲明屬性,但是您仍然需要一種方法來談論基礎類。所以,如果在基類的訪問爲protected

class A 
{ 
    public string prop 
    { 
     get; 
     protected set; 
    } 
} 
class B : A 
{ 
    public new string prop 
    { 
     get { return base.prop; } 
     set { base.prop = value; } 
    } 
} 
相關問題