我有一堆不同的表单,我想为它创建一个基础MustInherit
类。我希望它们包含的一个函数是一个名为GetForms()
的共享函数。我知道您无法声明共享函数MustOverride
所以我在抽象类中执行了以下操作:
Public Shared Function GetForms() As List(Of OrderForm)
'to be overridden in child class'
Return Nothing
End Function
这在我的孩子班上:
Public Overloads Shared Function GetForms() As List(Of OrderForm)
'do stuff'
End Function
这会导致问题,或者这是一种可接受的解决方法吗?它有一股气味,但它会强制我的所有表单都包含一个共享的GetForms函数。
编辑我意识到如果接口可以实现,我会使用一个,但你不能在接口中声明共享功能,我想确保这是一个SHARED功能。
答案 0 :(得分:3)
这有一种气味,因为它会产生对代码行为的错误期望。
你提到你这样做的原因是'它会强制我的所有表单都包含一个共享的GetForms函数'。这只是部分正确。是的,它们都将具有GetForms
功能,但您实际上并不是强制派生类来实现它们自己的版本。如果你忘记在其中一个上实现该函数,你将调用基本版本,并且你不会从编译器得到任何关于它的警告。
这就是气味:它实际上无法强制执行您想要的行为,但乍一看它会产生一种印象。从现在开始,当您添加新的表单类型并且您忘记了约定时,这将导致头痛。在测试期间开始得到不好的结果之前,你不会发出任何错误的警告。
如果要强制执行行为,则必须使用实例成员执行此操作;使用MustOverride
(抽象)函数或接口。
答案 1 :(得分:1)
您可以使用这样的静态(共享)方法,但不能强制执行它们。
每个静态方法都是它的类的本地方法,你不能在子类中重载它或使它成为抽象的(MustInherit)。您必须使用实例方法(非静态)来获取所需的面向对象方面。
答案 2 :(得分:0)
答案 3 :(得分:0)
为什么不简单地将其声明为:
Public MustOverride Function GetForms() As List(Of OrderForm)?
答案 4 :(得分:0)
静态方法不是继承的,因此压倒的期望不是我们想要鼓励的。换句话说,我认为你可能会在这里咆哮错误的树。