【问题标题】:How do I share identical code snippets between various classes without using an intermediate class nor Shared?如何在不使用中间类或共享的情况下在各个类之间共享相同的代码片段?
【发布时间】:2019-06-08 03:19:51
【问题描述】:

我有 2 个类 A 和 B,它们共享 2 个函数 S1 和 S2,两个类中的代码完全相同:

Public Class A
    Private Coll as New Collection
    Public Sub A1()
    End Sub
    Public Function A2() As String
    End Function
    'Identical functions:
    Public Function S1() As Int32
        ...
        Coll.Add(Something1)
    End Function
    Public Function S2() As Boolean
        ...
        Coll.Add(Something2)
    End Function
End Class

Public Class B
    Private Coll as New Collection
    Public Sub B1(Arg1 As Boolean)
    End Sub
    Public Function B2() As Int32
    End Function
    'Identical functions:
    Public Function S1() As Int32
        ...
        Coll.Add(Something1)
    End Function
    Public Function S2() As Boolean
        ...
        Coll.Add(Something2)
    End Function
End Class

S1 和 S2 是与实例字段交互并生成一些对象的工厂函数,它们分别进入A 和B 中的本地集合,因此Shared 的解决方案可能没有选择(? ),似乎也不会将常用函数打包到可行的基类中 (?)。

出于可维护性的原因,我希望将包含S1 和S2 的整个代码块定义在一个地方,最好是在一个专用文件"CommonMethods.vb" 中。

出于可用性原因,我需要直接访问所有成员,而不使用中间类C。 C 的存在绝对是反直觉的,无论它的名字是什么。输入A.时,Intellisense 应显示以下成员

A1, A2, S1, S2

而不是

A1, A2, C

当输入B.时

B1, B2, S1, S2

而不是

B1, B2, C

如果#Include Filename 存在于 VB.NET 中,我会这样做:

Public Class A
    Public Sub A1()
    End Sub
    Public Function A2() As String
    End Function
#Include CommonFunctions.vb
End Class

Public Class B
    Public Sub B1(Arg1 As Boolean)
    End Sub
    Public Function B2() As Int32
    End Function
#Include CommonFunctions.vb
End Class

但是没有#Include。

因此问题是:如何共享相同的代码文本?

【问题讨论】:

  • 为什么不用通用代码创建一个基类并继承它呢?
  • @Vasya 继承类维护一个集合,比如Private goTags As New Collection,基类中的函数S1 和S2 需要访问该集合。基类中的此类函数可能包含:Dim oText = New Text(Arg1)、goTags.Add(oText)、Return (oText)。
  • 所以把goTags也放在基类中,并声明它Protected。然后它的行为就像Private 成员一样,但基类和派生类中的代码都可以访问它。

标签: .net vb.net visual-studio oop maintainability


【解决方案1】:

如果您希望基类和派生类可以访问它而不是这些类的消费者可以访问它,您可以将所有通用功能(字段、属性、方法等)放在基类中并声明为Protected。如果基类之间的实现可能不同,您始终可以分别声明基类及其成员MustInherit 和MustOverride。

【讨论】:

    猜你喜欢
    • 2018-05-25
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-10-21
    • 1970-01-01
    • 1970-01-01
    • 2019-07-03
    • 1970-01-01
    相关资源
    最近更新 更多