如何让类公开相同的Shared / Static方法

时间:2010-03-04 04:31:08

标签: asp.net vb.net inheritance

我有一个带有几个派生类的基类。我希望所有派生类都具有相同的Public Sharedstatic)方法和自己的实现。我该怎么做呢?它甚至可能吗?

3 个答案:

答案 0 :(得分:2)

我知道这似乎是一个有用的功能“在设计时”但想象一下如何使用它:

如果GetFormsShared(C#中的static),则您没有具有类型的对象来区分使用哪种方法,即您不能说{{1在某种程度上可以确定实际调用BaseForm.GetForms()ChildFormTypeA.GetForms()中的哪一个。

您可以做的最好的事情是,如果您只是想要显式调用ChildFormTypeB.GetForms()ChildFormTypeA.GetForms(),或者如果您真的需要这个概念,请将其作为工厂方法,这就是意图。

ChildFormTypeB.GetForms()

现在你需要

MustInherit Class BaseForm

  MustOverride Sub GetForms()

End Class

Class MyForm
   Inherits BaseForm

   Public Sub New()
   End Sub

   Overrides Sub GetForms()
   End Sub   
End Class

或者Dim f as BaseForm = New MyForm f.GetForms 可能是GetForms并从Protected调用。


编辑:这几乎是一个新答案。

我在维护现有代码时只需要这个。我认为最简单的方法是让两个类都实现一个接口:

Sub New

(在这种情况下,我通过泛型约束Interface ISharedNew Function SharedNew(ByVal Argument As String) As ISharedNew End Interface 使用了类,我需要构造函数现在有一个通用约束不支持的参数。)

新的(简化的)通用代码现在是:

T As New

就我而言,Function GetNew(Of T As {New, ISharedNew})(ByVal Argument As String) As T Return DirectCast((New T).SharedNew(Argument), T) End Function 忽略了New T对象本身,但其类型确实指定了SharedNew的相关实例,后者创建了一个新的SharedNew对象使用T

代码已从头开始添加到此答案中,未引用实际代码。

答案 1 :(得分:0)

没有。你可以使用单身,但可能有更好的设计。

答案 2 :(得分:0)

根据定义,静态方法不能声明为虚拟。要在没有静态方法的情况下实现此目的,您可以执行以下操作:

public abstract class BaseFoo
{
    protected virtual void Bar()
    {
    }
}

public class Foo : BaseFoo
{
    protected override void Bar()
    {
        base.Bar();
    }
}

如果你想要实现类似于静态的东西,你可以使用单例模式,这样你就可以共享一个对象的实例。

修改

我意识到你的原始问题谈到了VB语法,所以这里的内容与VB中的相同:

Public MustInherit Class BaseFoo

    Protected Overridable Sub Bar()
    End Sub

End Class

Public Class Foo
    Inherits BaseFoo

    Protected Overrides Sub Bar()
        MyBase.Bar()
    End Sub

End Class