Как я могу разделить идентичные фрагменты кода между различными классами без использования промежуточного класса или Shared? - PullRequest
0 голосов
/ 08 июня 2019

У меня есть 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 было бы абсолютно антиинтуитивно, как бы оно ни называлось.Intellisense должен отображать следующие элементы при наборе A.

A1, A2, S1, S2

, а не

A1, A2, C

и при наборе B.

B1, B2, S1, S2

, а не

B1, B2, C

Если бы в VB.NET существовало #Include Filename, я бы сделал:

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.

Отсюда вопрос: как можноЯ использую идентичный код?

1 Ответ

1 голос
/ 08 июня 2019

Вы можете поместить все общие функции - поля, свойства, методы и т. Д. - в базовый класс и объявить его Protected, если вы хотите, чтобы он был доступен для базового класса и производных классов, но не для потребителей этих классов.В случаях, когда реализации могут различаться для базовых классов, вы всегда можете объявить базовый класс и эти члены MustInherit и MustOverride соответственно.

...