[英]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)
的类来摆脱该模块。然后继承该类,而不是B
和D
类中的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.