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
    属性,该属性链接到abstract
    GetName
    SetName
    方法。它还应提供一些指示是否支持
    SetName
    的方法(例如
    CanSetName
    方法)。类的只读变量可以定义一个“新的”只读
    Name
    属性,该属性将链接到
    GetName
    ,并使其
    SetName
    覆盖throw
    NotSupportedException
    。如果类的规范规定,
    SetName
    仅在
    CanSetName
    返回true时才起作用,然后让
    SetName
    CanSetName
    返回false的类中抛出异常不会违反Liskov替换原则。

    在基类中需要setter有什么原因吗?@DarylTeo是的,基类需要支持手动设置名称,虽然它可能在构造函数中。-1这表明它尚未实现,但即将实现。大多数情况下,这不适用于productionFair point。通常用作代码生成器的默认异常。hm。。这句话是有道理的,尽管它与我正在做的有点相反。+1这句话是对这个问题的确切回答,是当我有派生类,但由于某种原因无法实现抽象时我是如何做的method@Ray-你也在做同样的事。再读一遍:)@Petar:同意-删除我的答案。我一直在寻找UnsupportedOperationException,这是Java中合适的一个,在找不到它之后,我选择了InvalidOperationException,这是错误的,原因如下。