C# 当不允许属性设置程序时,要引发什么异常?
我有一个具有虚拟属性的基类:C# 当不允许属性设置程序时,要引发什么异常?,c#,.net,inheritance,properties,C#,.net,Inheritance,Properties,我有一个具有虚拟属性的基类: public virtual string Name { get; set; } 然后我有一个派生类,它只重写属性的getter public override string Name { get { return "Fixed Name"; } } 问题是这只会覆盖getter。如果有人调用setter,基类setter将被调用,调用方将不知道它是无效的 所以我想我应该做一些类似的事情: public override string Name {
public virtual string Name { get; set; }
然后我有一个派生类,它只重写属性的getter
public override string Name
{
get { return "Fixed Name"; }
}
问题是这只会覆盖getter。如果有人调用setter,基类setter将被调用,调用方将不知道它是无效的
所以我想我应该做一些类似的事情:
public override string Name
{
get { return "Fixed Name"; }
set { throw new Exception(); } //which exception type?
}
因此,有两个(相关问题):
NotSupported
和invalidooperation
抛出异常之间有相同的争论。
引自链接:
基类中不支持某些方法,但
期望这些方法将在派生的应用程序中实现
改为上课。派生类可能只实现
方法,并抛出NotSupportedException
不支持的方法
我认为这不是一个正确的选择。
引用MSDN:
当方法调用对的无效时引发的异常
对象的当前状态
在你的处境中,没有任何关于当前状态的东西。这是因为类契约不支持该操作。这里我要说的是。它违反了Liskov替换原则,这就是为什么这是个坏主意。如果可以,您可以尝试将setter移动到基类的构造函数,并使setter私有。或者像Jon建议的那样,使用所有实现中支持的getter创建抽象基类/接口
这将避免引发异常的整个情况。如果基类实际上允许设置名称(与公开抽象setter相反,抽象setter不能保证工作),则派生类也应该这样做。如果您想要一个层次结构,其中包括一些可以设置名称的类和一些不能设置名称的类,那么这两种类都应该继承自一个抽象的
ReadableXX
类,该类具有一个非虚拟的读写name
属性,该属性链接到abstractGetName
和SetName
方法。它还应提供一些指示是否支持SetName
的方法(例如CanSetName
方法)。类的只读变量可以定义一个“新的”只读Name
属性,该属性将链接到GetName
,并使其SetName
覆盖throwNotSupportedException
。如果类的规范规定,SetName
仅在CanSetName
返回true时才起作用,然后让SetName
在CanSetName
返回false的类中抛出异常不会违反Liskov替换原则。在基类中需要setter有什么原因吗?@DarylTeo是的,基类需要支持手动设置名称,虽然它可能在构造函数中。-1这表明它尚未实现,但即将实现。大多数情况下,这不适用于productionFair point。通常用作代码生成器的默认异常。hm。。这句话是有道理的,尽管它与我正在做的有点相反。+1这句话是对这个问题的确切回答,是当我有派生类,但由于某种原因无法实现抽象时我是如何做的method@Ray-你也在做同样的事。再读一遍:)@Petar:同意-删除我的答案。我一直在寻找UnsupportedOperationException,这是Java中合适的一个,在找不到它之后,我选择了InvalidOperationException,这是错误的,原因如下。