【问题标题】:Is this ASP.NET Inherited Shared Function practice acceptable?这种 ASP.NET Inherited Shared Function 做法是否可以接受?
【发布时间】:2010-11-16 01:43:06
【问题描述】:

我有一堆不同的表单,我想为其创建一个基本的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 函数。

编辑我意识到如果接口可以实现,我会使用一个,但你不能在接口中声明共享函数,我想确保这是一个共享函数。

【问题讨论】:

  • 您对共享关键字的理解是什么?而且,你认为你为什么要使用它?
  • 请在 scottE 的帖子下查看我的评论
  • 您是否曾在这里找到解决问题的方法?
  • @hamlin11 不,我只是手动实现了共享函数,而不是通过任何类型的接口/继承来强制执行它们。蹩脚,但哦,好吧
  • 这就是我开始做的事情。我有用于在一堆业务对象上进行自定义序列化的实例函数,但是我正在做一些通用类型和委托的东西来减少代码......长话短说,我还必须为每个业务对象实现一个小型共享序列化程序将类的实例作为参数的实例序列化程序。它所做的只是:“返回 InstanceArg.Serialize()”。我讨厌编写一堆只做这些的函数,但我已经对我的人进行了实践教育,我们把它放在主要的序列化函数下面,这样它就不会太难看。祝你好运,谢谢

标签: asp.net inheritance architecture


【解决方案1】:

这有异味,因为它对代码的行为产生了错误的期望。

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

这就是气味:它实际上无法强制执行您想要的行为,但乍一看,它给人的印象是它可以。 6 个月后,当您添加新的表单类型并且忘记了约定时,这将导致头疼。除非您在测试期间开始得到不好的结果,否则您不会收到任何错误的警告。

如果你想强制行为,你必须使用实例成员;使用MustOverride(抽象)函数或接口。

【讨论】:

  • 是的,我一直在研究代码并意识到它实际上并没有强制执行这一点。所以基本上,我唯一能做的就是记住在每种形式中都使用GetForms() 函数。太棒了。
  • 另一方面,有没有办法强制继承和覆盖共享函数?我似乎无法弄清楚如何,而且我看过的每一个资源都告诉我没有任何解决方法......
  • 没有允许强制覆盖共享成员的语言机制。解决方法是重新考虑您的设计,以便与表单一起使用的代码不关心它们是什么类型,或者使用辅助函数,或者工厂创建可以根据需要处理每种类型的表单的处理程序。跨度>
【解决方案2】:

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

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

【讨论】:

    【解决方案3】:

    是的,确实有味道!

    看来您应该改用接口。

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

    【讨论】:

    • 你不能在接口中声明共享函数
    • 看起来他想强制类来实现某些功能,这听起来是使用接口的好理由。
    • 除了我希望它是共享的...而且您不能使用接口将函数声明为共享...
    • 您能解释一下为什么必须共享这些方法吗?如果必须,您始终可以使用辅助函数,就像我过去使用 DAL 和可插入数据访问层所做的那样。
    • 假设我有一个由 5 种不同类型的表单组成的订单。每个订单对于每种类型的表单都可以有多个表单,因此类型 1 为 3,类型 2 为 5,等等。与其拥有“GetAllForm1”、“GetAllForm2”,我宁愿拥有一个共享的 GetForms,我可以只调用它在类级别,比如 Form1.GetForms。这样,行为在每个表单中都是一致的。是的,我很想使用接口,但这根本不可能,因为您不能在接口中声明共享函数。
    【解决方案4】:

    你为什么不简单地把它声明为:

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

    【讨论】:

      【解决方案5】:

      静态方法不会被继承,因此我们不希望鼓励重写。换句话说,我认为你可能在这里找错了树。

      【讨论】:

        猜你喜欢
        • 2011-11-19
        • 1970-01-01
        • 1970-01-01
        • 2011-03-20
        • 2014-08-25
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2011-04-17
        相关资源
        最近更新 更多