簡體   English   中英

不允許使用屬性設置器時拋出什么異常?

[英]What exception to throw when a property setter is not allowed?

我有一個具有虛擬屬性的基類:

public virtual string Name { get; set; }

然后我有一個派生類,只覆蓋屬性的getter

public override string Name
{
    get { return "Fixed Name"; }
}

問題是這只會覆蓋吸氣劑。 如果有人調用setter,則會調用基類setter,並且調用者不會知道它無效。

所以我想我會做類似的事情:

public override string Name
{
    get { return "Fixed Name"; }
    set { throw new Exception(); } //which exception type?
}

所以兩個(相關問題):

  1. 我有更好的模式可供使用嗎?
  2. 如果我應該使用上面的模式,使用什么例外?

編輯 :為什么一個例外優先於另一個例外的一些原因是好的。 我的同事和我在NotSupportedInvalidOperation之間有相同的參數。

拋出NotSupportedException異常。 從鏈接引用:

基類中不支持某些方法,期望這些方法將在派生類中實現。 派生類可能只實現基類中的方法的子集,並為不支持的方法拋出NotSupportedException。

我的觀點是InvalidOperationException不是一個正確的選項。 從MSDN引用:

方法調用對於對象的當前狀態無效時引發的異常。

在您的情況下,目前的狀態是什么。 這是班級合同不支持該操作。

它打破了利斯科夫替代原則,這就是為什么這是個壞主意。

如果可以,您可以嘗試將setter移動到基類的構造函數,並將setter設為私有。 或者,Jon建議使用所有實現中都支持的getter創建抽象基類/接口。

這可以避免拋出異常的整個情況。

如果基類實際上允許設置名稱(而不是暴露不能保證工作的抽象setter),派生類也應該這樣做。 如果你想要一個包含一些可以設置名稱的類的層次結構和一些不能設置它的類,那么這兩種類都應該從一個抽象的ReadableXX類繼承,該類具有非虛擬讀寫Name屬性,該屬性鏈接到抽象GetNameSetName方法。 它還應該提供一些指示是否支持SetName方法(例如CanSetName方法)。 該類的只讀變體可以定義一個“new”只讀Name屬性,該屬性將鏈接到GetName ,並使其SetName重寫拋出NotSupportedException 如果類的規范說SetName僅在CanSetName返回true時有效,那么讓SetNameCanSetName返回false的類中拋出異常將不會違反Liskov Substitution Principle。

在這里,我要去一個NotImplementedException

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM