2009-08-04 90 views
5

在一個基類我有這樣的特性:爲什麼我不能添加一個訪問器到一個重寫屬性?

public virtual string Text 
{ 
    get { return text; } 
} 

我想重寫,並返回不同的文字,但我也希望能夠設置文本,所以我這樣做:

public override string Text 
{ 
    get { return differentText; } 
    set { differentText = value; } 
} 

但是這不起作用。根據set,我得到一個紅色的波浪曲線,說我不能重寫,因爲它沒有設置存取器。爲什麼這是個問題?我該怎麼辦?

+0

我想這樣做完全一樣的。應該是可以的。 – 2015-02-27 13:20:53

+0

這是可能的,但需要一個「中產階級」。在許多情況下,它可能不是一個好主意,但是有一些例外情況,例如重寫抽象屬性時。基地:`公共抽象字符串文本{get; }`。中間(繼承基礎):`受保護的內部字符串文本;``公開密碼覆蓋字符串文本{get {return text; }}。子(繼承中):`public new string Text {get {return text; } set {text = value; }}。受保護的內部修改器和密封覆蓋確保封裝不會在組件外部破碎。 – AnorZaken 2015-10-11 18:31:29

+0

@AnorZaken:這不是最重要的,那是陰影。它也不需要「中等」級別。 – Guffa 2015-10-11 19:46:38

回答

3

在你正在創建一個公共組方法的代碼第二塊集的方法,但這個詞「覆蓋」在聲明中使編譯器在基類中尋找具有相同簽名的方法。由於它找不到該方法,因此不會允許您創建您的設置。

正如ArsenMkrt所說,您可以更改您的基本聲明以包含受保護的集合。這將允許您覆蓋它,但由於您仍然無法更改簽名,因此您無法將此方法在您的子類中公開,因此您發佈的代碼仍然無效。

相反,您需要爲您的基類添加一個公共虛擬集合方法,它不會做任何事情(甚至在您嘗試調用它時甚至會引發異常),但這違背了該類的用戶期望的行爲是如此,如果你這樣做(我不會推薦它),確保它做到有據可查的是,用戶不能錯過:

///<summary> 
///Get the Text value of the object 
///NOTE: Setting the value is not supported by this class but may be supported by child classes 
///</summary> 
public virtual string Text 
{ 
    get { return text; } 
    set { } 
} 

//using the class 

BaseClass.Text = "Wibble"; 
if (BaseClass.Text == "Wibble") 
{ 
    //Won't get here (unless the default value is "Wibble") 
} 

否則聲明集作爲一個單獨的方法你的孩子班級:

public override string Text 
{ 
    get { return differentText; } 
} 

public void SetText(string value) 
{ 
    differentText = value; 
} 
3
public virtual string Text 
{ 
    get { return text; } 
    protected set {} 
} 

喜歡這種改變基類屬性,您試圖重寫不存在

2

這是一個問題,因爲你是分手g封裝。您無法重寫某些內容並使其更易於訪問,這會將封裝的所有內容拋出窗口。

這就是規則,它也適用於你的情況,儘管你實際上暴露了一些不是原始值的東西。

沒有辦法做到你想要的。您必須在基類中創建一個setter,或者使用另一種設置新值的方法。

2

可以隱藏從基類的屬性:

public new string Text 
{ 
    get { return differentText; } 
    set { differentText = value; } 
} 

但在這種情況下,通過這種類型的變量操縱對象時屬性將只被使用,而不是基本類型

2

您希望在使用子類型時可以暴露更多功能。這聽起來像你不想重寫,你想影子。只需使用new關鍵字來隱藏可讀/可寫屬性下的只讀Text屬性即可。

在基類:

protected string text; 
public string Text 
{ 
    get { return text; } 
} 

在派生類中:

new public string Text 
{ 
    get { return text; } 
    set { text = value; } 
} 
相關問題