【问题标题】:Inherit same Method for 2 Different Class为 2 个不同的类继承相同的方法
【发布时间】:2010-12-19 08:33:52
【问题描述】:

如何简化,类中的两个方法是相同的。
第一类。

Public Class Gui
Inherits System.Web.UI.Page


Public Sub CreateStyleLink(ByVal StyleArray() As String)
    Dim StrStyleLink As String

    For Each StyleName In StyleArray
        StrStyleLink = [Global].ArrStyles(StyleName)

        Dim ObjScript As New HtmlGenericControl("link")
        ObjScript.Attributes.Add("rel", "Stylesheet")
        ObjScript.Attributes.Add("type", "text/css")
        ObjScript.Attributes.Add("href", StrStyleLink)
        Me.Page.Header.Controls.Add(ObjScript)
    Next
End Sub


Public Sub CreateScriptLink(ByVal ScriptArray() As String)
    Dim ScriptLink As String

    For Each ScriptName In ScriptArray
        ScriptLink = [Global].ArrScripts(ScriptName)

        Dim ObjScript As New HtmlGenericControl("script")
        ObjScript.Attributes.Add("type", "text/javascript")
        ObjScript.Attributes.Add("src", ScriptLink)
        Me.Page.Header.Controls.Add(ObjScript)
    Next
End Sub


Public Sub SetSelectedMenu(ByVal MenuName As String, Optional ByRef ObjPage As Page = Nothing)
    Dim ObjMenu As New HtmlGenericControl

    If ObjPage Is Nothing Then
        ObjMenu = MyBase.Page.FindControl(MenuName)
    Else
        ObjMenu = ObjPage.FindControl(MenuName)
    End If
    ObjMenu.Attributes.Add("class", "selected")
End Sub


Public Sub ExecuteScript(ByVal ScriptName As String, Optional ByVal ScriptParam As String = "")
    Dim requestSM As ScriptManager = ScriptManager.GetCurrent(Me.Page)
    If Not requestSM Is Nothing And requestSM.IsInAsyncPostBack Then
        ScriptManager.RegisterStartupScript(Me.Page, Me.GetType, ScriptName, ScriptName + "('" + ScriptParam + "');", True)
    Else
        Me.Page.ClientScript.RegisterStartupScript(Me.GetType, ScriptName, ScriptName + "('" + ScriptParam + "');", True)
    End If
End Sub

End Class

二等。

Public Class GuiControl
Inherits System.Web.UI.UserControl


Public Sub CreateStyleLink(ByVal StyleArray() As String)
    Dim StrStyleLink As String

    For Each StyleName In StyleArray
        StrStyleLink = [Global].ArrStyles(StyleName)

        Dim ObjScript As New HtmlGenericControl("link")
        ObjScript.Attributes.Add("rel", "Stylesheet")
        ObjScript.Attributes.Add("type", "text/css")
        ObjScript.Attributes.Add("href", StrStyleLink)
        Me.Page.Header.Controls.Add(ObjScript)
    Next
End Sub


Public Sub CreateScriptLink(ByVal ScriptArray() As String)
    Dim ScriptLink As String

    For Each ScriptName In ScriptArray
        ScriptLink = [Global].ArrScripts(ScriptName)

        Dim ObjScript As New HtmlGenericControl("script")
        ObjScript.Attributes.Add("type", "text/javascript")
        ObjScript.Attributes.Add("src", ScriptLink)
        Me.Page.Header.Controls.Add(ObjScript)
    Next
End Sub


Public Sub ExecuteScript(ByVal ScriptName As String, Optional ByVal ScriptParam As String = "")
    Dim requestSM As ScriptManager = ScriptManager.GetCurrent(Me.Page)
    If Not requestSM Is Nothing And requestSM.IsInAsyncPostBack Then
        ScriptManager.RegisterStartupScript(Me.Page, Me.GetType, ScriptName, ScriptName + "('" + ScriptParam + "');", True)
    Else
        Me.Page.ClientScript.RegisterStartupScript(Me.GetType, ScriptName, ScriptName + "('" + ScriptParam + "');", True)
    End If
End Sub
End Class

【问题讨论】:

  • 创建一个它们都继承自的基类?

标签: asp.net vb.net oop class inheritance


【解决方案1】:

创建一个定义方法和inherit from that 的基类(可能是抽象类)。

您也可以使用extension method

【讨论】:

  • 扩展可能完成这项工作,而不是抽象。
【解决方案2】:

我会将它们创建为实用程序类的简单静态成员,或者如果您愿意,可以将静态成员扩展为 UserControl 的扩展方法

这是一个实用程序类的快速示例,未经测试,VB 不是我最常使用的语言,因此请原谅任何轻微的语法疏忽。

Class NotInheritable UserControlHelper
    Public Sub CreateStyleLink(ByVal control as UserControl, _
      ByVal StyleArray() As String)
        Dim StrStyleLink As String

        For Each StyleName In StyleArray
            StrStyleLink = [Global].ArrStyles(StyleName)

            Dim ObjScript As New HtmlGenericControl("link")
            ObjScript.Attributes.Add("rel", "Stylesheet")
            ObjScript.Attributes.Add("type", "text/css")
            ObjScript.Attributes.Add("href", StrStyleLink)
            control.Page.Header.Controls.Add(ObjScript)
        Next
    End Sub


    Public Sub CreateScriptLink(ByVal control as UserControl, _
      ByVal ScriptArray() As String)
        Dim ScriptLink As String

        For Each ScriptName In ScriptArray
            ScriptLink = [Global].ArrScripts(ScriptName)

            Dim ObjScript As New HtmlGenericControl("script")
            ObjScript.Attributes.Add("type", "text/javascript")
            ObjScript.Attributes.Add("src", ScriptLink)
            control.Page.Header.Controls.Add(ObjScript)
        Next
    End Sub

    Private Sub New()
    End Sub
End Class

然后可以在您有 UserControl 作为第一个参数传入的任何地方使用它。我不确定是否可以在 VB.NET 中定义扩展方法,我的东西 2010 支持这一点,但我可能错了。

【讨论】:

    【解决方案3】:

    创建一个基类只是为了继承一个通用方法通常不是可行的方法。继承旨在创建更具体的对象类型,而不仅仅是为了共享。在这种情况下,一个是 Page,另一个是 UserControl,可能没有定义层次关系。

    因此,基本如 Chris 所述,实用程序或帮助程序类可能是要走的路。我要做的一个补充是让这两个方法共享,这样就不需要一个实例来使用。

    通过使用普通的实例方法,您必须沿着这条路线走一些路:

    Dim help As New UserControlHelper
    help.CreateScriptLink(Me)
    

    与共享方法相反,可以这样做:

    UserControlHelper.CreateScriptLink(Me)
    

    我不记得Page是否继承自UserControl(反之亦然),所以你可能需要找到一个更高的类来传递给方法,但思路基本相同。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2020-02-05
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多