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

时间:2017-12-25 14:05:55

标签: vb.net

我的案例如下(VB.NET):

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

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

有一些常见的方法和功能,我希望它们集中在B类和B类上。 D,无需重新编写它们并在两个类下保持更新。

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

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

我的解决方案是创建新的Abstract(MustInherit)类X并从类A和A中移动公共字段。 C到X类。然后创建了一个'朋友'模块,它具有那些常见的方法和功能(针对A和C类之间的公共字段),它采用IEnumerable(在X类中)..并且瞧!

对此类实施的任何评论??

由于

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

-webkit,-o,-moz

1 个答案:

答案 0 :(得分:0)

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

在您的案例中使用界面与抽象类有什么区别?

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

抽象类:它实际上托管了实现的公共字段和方法,因此类不需要复制代码,只要它们是相同的。

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

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对其进行了限定,但您可以决定是否要这样做。