У меня есть функция, которую мне нужно вызывать для трех разных типов, при этом базовая логика остается одинаковой для всех разных типов, поэтому я решил, что было бы лучше написать эту функцию с использованием обобщений.
Вот основная схема участвующих классов и функций:
'PO Base class'
Public MustInherit Class ProductionOrder
Public MustInherit Class Collection(Of T)
Inherits System.Collections.Generic.Dictionary(Of Long, T)
End Class
'....'
End Class
Public Class ProfileProductionOrder
Inherits ProductionOrder
Public Class Collection
Inherits ProductionOrder.Collection(Of ProfileProductionOrder)
End Class
'....'
End Class
Public Class UnitProductionOrder
Inherits ProductionOrder
Public Class Collection
Inherits ProductionOrder.Collection(Of UnitProductionOrder)
End Class
'....'
End Class
Public Class CrateProductionOrder
Inherits ProductionOrder
Public Class Collection
Inherits ProductionOrder.Collection(Of CrateProductionOrder)
End Class
'....'
End Class
'Generic function, intended to work on profile, unit, and crate production orders.'
'This method resides in the base class of the GUI.'
Protected Sub FillPOCells(Of T As ProductionOrder.Collection(Of ProductionOrder)) _
(ByVal dgv As DataGridView, ByVal ProductionOrders As T)
'...do some stuff'
End Sub
'This function resides in the Profile child GUI class.'
Protected Sub LoadDataGridViewPOs()
Dim dgv As DataGridView
Dim ProductionOrders As ProfileProductionOrder.Collection
'....'
'Fill PO Cells'
FillPOCells(Of ProfileProductionOrder.Collection)(dgv, ProductionOrders)
'....'
End Sub
Базовые и дочерние классы ProductionOrder компилируются, как и функция FillPOCells. Но когда я вызываю FillPOCells внутри LoadDataGridViewPO, компилятор жалуется, что «Аргумент типа« ProfileProductionOrder.Collection »не наследует и не реализует тип ограничения« ProductionOrder.Collection (Of ProductionOrder) ».
Кроме того, вот несколько объяснений того, почему все настроено таким образом. Мой предшественник установил соглашение о размещении коллекции объекта как подкласса внутри него, поэтому его легко назвать Obj.Collection. Далее, причина, по которой нам нужны три разных типа производственных заказов, заключается в том, что они обрабатываются по-разному и хранятся в разных таблицах и т. Д. На серверной части. Наконец, я понимаю, что мог бы реализовать это довольно легко, не заставляя работать эту конкретную универсальную функцию, но я рассматриваю это как учебный опыт для улучшения моего понимания дженериков и ОО-дизайна.
Итак, вопрос в том, почему я получаю эту ошибку компилятора и как я должен изменить свой класс и общий дизайн, чтобы выполнить то, что я имею в виду?
Если вам нужно какое-либо дальнейшее объяснение того, что я пытаюсь сделать или как у меня все настроено, дайте мне знать. Основная идея заключается в том, чтобы иметь функцию, которая может принимать коллекцию, элементы которой принадлежат одному из дочерних классов ProductionOrder, и запускать операции над этими элементами, которые используют только функциональные возможности, содержащиеся в их базовом классе ProductionOrder (следовательно, почему любой из дочерних типов является нормально работать в функции).