【发布时间】: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 世界中,这两种方法的示例都没有返回可接受的设计决策吗?