Как правильно кодировать эти универсальные функции и наследования классов? (VB .NET) - PullRequest
0 голосов
/ 13 февраля 2009

У меня есть функция, которую мне нужно вызывать для трех разных типов, при этом базовая логика остается одинаковой для всех разных типов, поэтому я решил, что было бы лучше написать эту функцию с использованием обобщений.

Вот основная схема участвующих классов и функций:

'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 (следовательно, почему любой из дочерних типов является нормально работать в функции).

1 Ответ

1 голос
/ 13 февраля 2009
'PO Base class'
Public MustInherit Class ProductionOrder(Of T)
     Public MustInherit Class Collection
          Inherits System.Collections.Generic.Dictionary(Of Long, T)
     End Class
     '....'
End Class

Public Class ProfileProductionOrder
     Inherits ProductionOrder(Of ProfileProductionOrder)
     '....'
End Class

Public Class UnitProductionOrder
     Inherits ProductionOrder(Of UnitProductionOrder)
     '....'
End Class

Public Class CrateProductionOrder
     Inherits ProductionOrder(Of CrateProductionOrder)
     '....'
End Class

Это намного проще, по моему мнению. Но я сильно сомневаюсь, что вам нужен CollectionClass.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...