我有一个带有几个派生类的基类。我希望所有派生类都具有相同的Public Shared
(static
)方法和自己的实现。我该怎么做呢?它甚至可能吗?
答案 0 :(得分:2)
我知道这似乎是一个有用的功能“在设计时”但想象一下如何使用它:
如果GetForms
是Shared
(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