Унаследовать один и тот же метод для 2 различных классов - PullRequest
0 голосов
/ 19 декабря 2010

Как это упростить, 2 метода в классе идентичны.
Первый класс.

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

Ответы [ 3 ]

1 голос
/ 19 декабря 2010

Создать базовый (возможно, абстрактный) класс, который определяет метод и наследует от него .

В качестве альтернативы вы можете использовать метод расширения .

0 голосов
/ 21 декабря 2010

Создание базового класса просто для наследования общего метода часто не подходит. Наследование предназначено для создания более определенного типа объекта, а не только для совместного использования. В этом случае один - это страница, другой - пользовательский элемент управления, который, вероятно, не определяет иерархические отношения.

Как таковой, скорее всего, будет маршрут утилиты или вспомогательного класса, в основном, как описал Крис. Одним из добавлений, которое я бы сделал, было бы сделать два метода Shared, чтобы не нуждаться в экземпляре просто для использования.

Используя обычный метод экземпляра, вам нужно будет что-то пройти по этому маршруту:

Dim help As New UserControlHelper
help.CreateScriptLink(Me)

в отличие от метода Shared, можно сделать так же:

UserControlHelper.CreateScriptLink(Me)

Я не помню, наследовал ли Page от UserControl (или наоборот), поэтому вам может потребоваться найти более высокий класс для перехода в метод, но идея в основном та же.

0 голосов
/ 19 декабря 2010

Я бы создал их как простые статические члены служебного класса или, если вы предпочитаете, можете расширить статические члены, чтобы они стали методами расширения 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 поддерживает это, но я могу ошибаться.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...