Рассмотрим следующий сценарий:Что такое хорошая практика для абстрагирования дженериков?
Public Class Condition(Of T)
'...
End Class
Теперь я создаю несколько экземпляров этого класса с различными типами. Теперь я хочу заполнить общий список этими экземплярами. Что-то вроде:
Dim Conditions As New List(Of Condition....?)
Conditions.add(new Condition(Of String))
Conditions.add(new Condition(Of Double))
Conditions.add(new Condition(Of CustomClass))
Каков наилучший способ для этого? На данный момент я делаю следующее:
Public Class Condition(Of T)
implements ICondition
'...
End Class
И использовать его так:
Dim Conditions As New List(Of ICondition)
Conditions.add(new Condition(Of String))
Conditions.add(new Condition(Of Double))
Conditions.add(new Condition(Of CustomClass))
Однако ICondition просто совершенно пуст. Что заставляет меня думать, что, вероятно, лучше или более приемлемым способом заниматься вещами. Я мог бы также наследовать от пустого базового класса, было бы лучше? Каков предпочтительный метод выполнения такого рода вещей?
Я понимаю, что до тех пор, пока список, содержащий обобщения, имеет более широкий тип, который я могу вставить в условия любого типа. Однако я не хочу делать его более широким, чем необходимо, - я хочу только иметь возможность вставлять объекты, которые являются экземплярами Public Class Condition(Of T)
, но типы которых могут отличаться.
Я знаю, что я мог бы просто сделать свой «Список (Of Condition ..)» более широким, чем-то вроде «List (Of Object)», но я хочу, чтобы ограничения типа были как можно более узкими, - они должны быть создан из 'Condition (Of T)' - но с произвольными типами. Я не делаю правильных последствий из статьи? – RutledgePaulV
Вы можете растягиваться за пределы ковариации и контравариантности, но я предположил, что ваш код был всего лишь образцом, а не фактическим рабочим кодом. Для ковариации и/или контравариантности, чтобы помочь вам, типы в объектах условия должны быть частью одного дерева наследования. Поскольку строки, int и double не взаимодействуют таким образом (за исключением того, что они являются объектами), у вас есть только 2 варианта - используйте Object в списке или используйте ICondition в списке. –
Хорошо, я вижу, как это может быть редким примером. Проект интересный;). До сих пор это было два раза в моем проекте .. но, возможно, это потому, что я пытаюсь заставить структуру, которая не существует естественным образом. Хотя, похоже, он хорошо подходит для проекта, поэтому я продолжу его. Благодарю. – RutledgePaulV