[英]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?
}
所以兩個(相關問題):
編輯 :為什么一個例外優先於另一個例外的一些原因是好的。 我的同事和我在NotSupported
和InvalidOperation
之間有相同的參數。
拋出NotSupportedException異常。 從鏈接引用:
基類中不支持某些方法,期望這些方法將在派生類中實現。 派生類可能只實現基類中的方法的子集,並為不支持的方法拋出NotSupportedException。
我的觀點是InvalidOperationException不是一個正確的選項。 從MSDN引用:
方法調用對於對象的當前狀態無效時引發的異常。
在您的情況下,目前的狀態是什么。 這是班級合同不支持該操作。
它打破了利斯科夫替代原則,這就是為什么這是個壞主意。
如果可以,您可以嘗試將setter移動到基類的構造函數,並將setter設為私有。 或者,Jon建議使用所有實現中都支持的getter創建抽象基類/接口。
這可以避免拋出異常的整個情況。
如果基類實際上允許設置名稱(而不是暴露不能保證工作的抽象setter),派生類也應該這樣做。 如果你想要一個包含一些可以設置名稱的類的層次結構和一些不能設置它的類,那么這兩種類都應該從一個抽象的ReadableXX
類繼承,該類具有非虛擬讀寫Name
屬性,該屬性鏈接到抽象GetName
和SetName
方法。 它還應該提供一些指示是否支持SetName
方法(例如CanSetName
方法)。 該類的只讀變體可以定義一個“new”只讀Name
屬性,該屬性將鏈接到GetName
,並使其SetName
重寫拋出NotSupportedException
。 如果類的規范說SetName
僅在CanSetName
返回true時有效,那么讓SetName
在CanSetName
返回false的類中拋出異常將不會違反Liskov Substitution Principle。
在這里,我要去一個NotImplementedException 。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.