【问题标题】:What is the best practice for abstract classes with overridable methods which return nothing具有可覆盖方法的抽象类的最佳实践是什么
【发布时间】:2013-06-27 10:57:38
【问题描述】:

对于返回 nothing 的抽象类中的 mustoverride/overridable 方法的最佳做法是什么。继承这个抽象类的具体类可以决定是否需要该功能,并可以根据需要覆盖。

现在我明白这是接口的功能,但抽象类中有很多管道代码需要“取消隐藏”才能实现。

我的问题是在你的项目中使用这些方法是不好的设计吗?

示例 1 - Concrete 类确实需要实现,但被强制覆盖该方法。

(摘要)

Friend MustOverride Function GetTitle() As String

(混凝土)

Friend Overrides Function GetTitle() As String 
        Return nothing
End Function

示例 2 - 如果需要,具体类可以覆盖该方法,但抽象类包含一个不返回任何内容的方法。

(摘要)

Friend Overridable Function GetTitle() As String
        Return nothing
End Function

(混凝土)

Friend Overrides Function GetTitle() As String
        Return "Title"
End Function

【问题讨论】:

  • 这真的取决于 - 返回 Nothing 是一个合理的默认实现吗?有时会——有时不会。请注意,您的第一个版本在 concrete 类中不返回任何内容,而实际上它应该返回“Title”。
  • 嗨乔恩,这个例子是为了证明为什么这个实现“感觉”错了。在示例一中,具体类不希望使用 title 方法,但需要重写该方法。在示例二中,具体的!我们的项目使用示例二,因为除非需要,否则具体类不会担心方法,但是在抽象类中使用不返回任何内容的方法仍然感觉不对。感谢您的回复:)
  • “最佳实践”由于被这样滥用而迅速成为一个毫无意义的术语。选择不是遵循最佳实践的产物,而是设计的产物。
  • @Richard:你改变了两件事:a)具体类是否想要返回一个值; b) 基类是否将方法声明为抽象的。为了进行有用的比较,您应该只更改其中的 一个
  • @JonSkeet 在纯 OO 世界中,这两种方法的示例都没有返回可接受的设计决策吗?

标签: .net oop


【解决方案1】:

如何表示“我不知道”完全由您决定。但是从抽象基类返回 Nothing 是一个非常糟糕的习惯。当从您的类派生的程序员或编写客户端代码的程序员没有意识到 Nothing 是可能的值时,很可能在客户端代码中生成 NullReferenceException。 NRE 是一个糟糕诊断的异常,CLR 无法给出任何有意义的提示。例如,它不可能命名存储空值的变量,它知道 Nothing

这变得特别难以诊断,因为生成的 null 至少与出错的地方相距 两个 级。为崩溃而背负重担的用户可能不得不与 三个 程序员交谈才能找到问题的根源。最终让你接电话会很不高兴。

如果你不能提供一个有意义的成员实现,那么永远毫不犹豫地声明它是抽象的。这样可以确保不会是您与生气的用户交谈。返回 String.Empty 是一种替代方法。也许这对你的设计有意义,我猜不出来。

【讨论】:

  • +1 谢谢你的解释,如果我有 15 名声望,我会的 :)
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2017-09-26
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-06-20
相关资源
最近更新 更多