我的案例如下(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
答案 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
对其进行了限定,但您可以决定是否要这样做。