Использование производного типа для переменных-членов в производных классах - PullRequest
1 голос
/ 01 октября 2019

Существует ли в качестве передового опыта способ работы с переменной-членом в производном классе, являющемся типом, который был объявлен в родительском классе?

Например, здесь приведены упрощенные классы «Производитель» и «Автомобиль»:

Public Class Manufacturer
    Protected _name As String
    Protected _country As String
End Class

Public Class Car
    Protected _manufacturer As Manufacturer

    Sub New(manufacturer)
        _manufacturer = manufacturer
    End Sub

End Class

Если я реализую следующие производные классы:

Public Class Honda
    Inherits Manufacturer

    Sub New()
        _name = "Honda"
        _country = "Japan"
    End Sub

    Public Property Prefecture As String

End Class

Public Class Accord
    Inherits Car

    Sub New(manufacturer)

        MyBase.New(manufacturer)

        ' This doesn't work
        _manufacturer.Prefecture = "Tokyo"

    End Sub

End Class

Единственный известный мне способ обойти эту проблему - привести _manufacturer к Honda:

    Dim myManufacturer As Honda = manufacturer
    myManufacturer.Prefecture = "Tokyo"

Другой подход, который я рассмотрел, заключается в создании оболочки для объекта _manufacturer:

Sub New(manufacturer As Honda)

    MyBase.New(manufacturer)

    MyManufacturer.Prefecture = "Tokyo"

End Sub

Private ReadOnly Property MyManufacturer() As Honda
    Get
        Return _manufacturer
    End Get
End Property

С ним немного проще работать.

Это дополнительные шаги, которые янадеюсь, что смогу избежатьСпасибо за любые указатели, которые вы можете дать мне.

1 Ответ

1 голос
/ 01 октября 2019

Один из подходов - сделать Car универсальным классом.

Public Class Car(Of T As Manufacturer)
    Protected _manufacturer As T

    Sub New(manufacturer As T)
        _manufacturer = manufacturer
    End Sub
End Class

Затем вы можете объявить Accord как класс, полученный из Car, где универсальный тип производителя равен Honda

Public Class Accord
    Inherits Car(Of Honda)

    Sub New(manufacturer As Honda)
        MyBase.New(manufacturer)

        ' This should work
        _manufacturer.Prefecture = "Tokyo"
    End Sub
End Class
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...