繁体   English   中英

针对两个类的通用方法/函数-VB.NET

[英]Common Methods/Functions against two Classes - VB.NET

我有一个情况如下(VB.NET):

A类(包含一些字段)B类继承List(Of A)

C类(包含一些字段)D类继承List(Of C)

我希望它们可以集中在一些通用的方法和函数上,并且可以同时作用于B和D类,而无需重写它们并使它们在两个类下都保持更新。

这些常见的方法和函数在类A和C中作用于相同的字段(名称和类型)。

我该怎么办? 为什么从List(Of T)继承被认为是一个坏主意?


我的解决方案是创建新的Abstract(MustInherit)类X,并将公共字段从A和C类移到X类。然后创建一个具有这些常用方法和功能的“朋友”模块(针对A和C类之间的公共字段) ),它需要IEnumerable(X类)..瞧!

对这种实现有何评论?


谢谢

以下是我使用IEnumerable的解决方案,但在单独的模块中使用了共享功能。

Public MustInherit Class ProbSts 'class X
    Public Status As Boolean
    Public Probability, Min, Max As Integer
End Class

Public NotInheritable Class SIPRouteProbabilityStatus 'class A
    Inherits ProbSts
    Public Route As SIPRoute
End Class

Public NotInheritable Class SIPRGProbabilityStatus ' class C
    Inherits ProbSts
    Public RG As SIPRouteGroup
End Class

Public NotInheritable Class SIPRouteProbabilityStatusCollection ' class B
    Inherits List(Of SIPRouteProbabilityStatus)
    Public ProbabilityTotal As Integer

    Public Function TotalProbability(Optional Status As Boolean? = Nothing) As Integer
        Return TotalProbabilityAction(Me, Status)
    End Function

End Class

Public NotInheritable Class SIPRGProbabilityStatusCollection 'class D
    Inherits List(Of SIPRGProbabilityStatus)
    Public ProbabilityTotal As Integer

    Public Function TotalProbability(Optional Status As Boolean? = Nothing) As Integer
        Return TotalProbabilityAction(Me, Status)
    End Function
End Class


Friend Module ProbabilityAction

    Public Function TotalProbabilityAction(ProbStsList As IEnumerable(Of ProbSts), Optional Status As Boolean? = Nothing) As Integer
        Dim sum As Integer = 0
        For Each x In ProbStsList
            If Status.HasValue Then
                If x.Status = Status.Value Then sum += x.Probability
            Else
                sum += x.Probability
            End If
        Next
        Return sum
    End Function

End Module

正确完成后,从List(Of T)继承没有任何问题。 在不了解类以及如何使用它们的情况下,很难提供最佳解决方案,但是从抽象类继承的解决方案是解决该问题的一种方法。 但是,根据您的描述,实现接口似乎更合适。 将X转换为具有公共字段的接口,您会很高兴。 实际字段将保留在A和C类中,但是外部函数将知道如何访问和使用它们。

在您的情况下,使用接口与抽象类有什么区别?

接口:它仅定义类的公共字段和方法,并将实现留给它们。

抽象类:它实际上包含实现的公共字段和方法,因此在相同的情况下,这些类无需复制代码。

编辑我不知道这是否是最好的解决方案,因为我需要查看代码中如何使用所有这些类,但是您可以通过将其转换为继承自List(Of T)的类来摆脱该模块。然后继承该类,而不是BD类中的List(Of T) 像这样:

Public MustInherit Class ProbSts 'class X
    Public Status As Boolean
    Public Probability, Min, Max As Integer
End Class

Public NotInheritable Class SIPRouteProbabilityStatus 'class A
    Inherits ProbSts

    Public Route As SIPRoute
End Class

Public NotInheritable Class SIPRGProbabilityStatus ' class C
    Inherits ProbSts

    Public RG As SIPRouteGroup
End Class

Public MustInherit Class ProbabilityAction(Of T)
    Inherits List(Of T)

    Public Function TotalProbabilityAction(ProbStsList As IEnumerable(Of ProbSts), Optional Status As Boolean? = Nothing) As Integer
        Dim sum As Integer = 0
        For Each x In ProbStsList
            If Status.HasValue Then
                If x.Status = Status.Value Then sum += x.Probability
            Else
                sum += x.Probability
            End If
        Next

        Return sum
    End Function
End Class

Public NotInheritable Class SIPRouteProbabilityStatusCollection ' class B
    Inherits ProbabilityAction(Of SIPRouteProbabilityStatus)

    Public ProbabilityTotal As Integer

    Public Function TotalProbability(Optional Status As Boolean? = Nothing) As Integer      
        Return TotalProbabilityAction(Me, Status)
    End Function
End Class

Public NotInheritable Class SIPRGProbabilityStatusCollection 'class D
    Inherits ProbabilityAction(Of SIPRGProbabilityStatus)

    Public ProbabilityTotal As Integer

    Public Function TotalProbability(Optional Status As Boolean? = Nothing) As Integer
        Return TotalProbabilityAction(Me, Status)
    End Function
End Class

我保留了模块ProbabilityAction的原始名称,但建议将其更改为更适合基类的名称。 我也按照您的方式进行操作,并使用MustInherit对其进行了限定,但是您可以决定是否MustInherit

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM