这个ASP.NET继承的共享函数实践是否可以接受?

时间:2009-08-01 18:04:21

标签: asp.net inheritance architecture

我有一堆不同的表单,我想为它创建一个基础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功能。

5 个答案:

答案 0 :(得分:3)

这有一种气味,因为它会产生对代码行为的错误期望。

你提到你这样做的原因是'它会强制我的所有表单都包含一个共享的GetForms函数'。这只是部分正确。是的,它们都将具有GetForms功能,但您实际上并不是强制派生类来实现它们自己的版本。如果你忘记在其中一个上实现该函数,你将调用基本版本,并且你不会从编译器得到任何关于它的警告。

这就是气味:它实际上无法强制执行您想要的行为,但乍一看它会产生一种印象。从现在开始,当您添加新的表单类型并且您忘记了约定时,这将导致头痛。在测试期间开始得到不好的结果之前,你不会发出任何错误的警告。

如果要强制执行行为,则必须使用实例成员执行此操作;使用MustOverride(抽象)函数或接口。

答案 1 :(得分:1)

您可以使用这样的静态(共享)方法,但不能强制执行它们。

每个静态方法都是它的类的本地方法,你不能在子类中重载它或使它成为抽象的(MustInherit)。您必须使用实例方法(非静态)来获取所需的面向对象方面。

答案 2 :(得分:0)

是的,确实有味道!

看起来你应该使用一个界面。

这是一篇vb.net文章:http://www.developer.com/lang/other/article.php/939411

答案 3 :(得分:0)

为什么不简单地将其声明为:

Public MustOverride Function GetForms() As List(Of OrderForm)?

答案 4 :(得分:0)

静态方法不是继承的,因此压倒的期望不是我们想要鼓励的。换句话说,我认为你可能会在这里咆哮错误的树。