2013-06-20 2 views
1

Рассмотрим следующий сценарий:Что такое хорошая практика для абстрагирования дженериков?

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), но типы которых могут отличаться.

ответ

1

Ответ отличается, в зависимости от используемой версии .NET Framework. Посмотрите статьи о covariance и contravвариантность, чтобы понять проблему. Here's an example.

NET 4 и 4.5 поддерживают этот вид использования.

Ранние версии .NET заставили бы вас использовать что-то вроде интерфейса ICondition, о котором вы упоминаете.

+0

Я знаю, что я мог бы просто сделать свой «Список (Of Condition ..)» более широким, чем-то вроде «List (Of Object)», но я хочу, чтобы ограничения типа были как можно более узкими, - они должны быть создан из 'Condition (Of T)' - но с произвольными типами. Я не делаю правильных последствий из статьи? – RutledgePaulV

+0

Вы можете растягиваться за пределы ковариации и контравариантности, но я предположил, что ваш код был всего лишь образцом, а не фактическим рабочим кодом. Для ковариации и/или контравариантности, чтобы помочь вам, типы в объектах условия должны быть частью одного дерева наследования. Поскольку строки, int и double не взаимодействуют таким образом (за исключением того, что они являются объектами), у вас есть только 2 варианта - используйте Object в списке или используйте ICondition в списке. –

+0

Хорошо, я вижу, как это может быть редким примером. Проект интересный;). До сих пор это было два раза в моем проекте .. но, возможно, это потому, что я пытаюсь заставить структуру, которая не существует естественным образом. Хотя, похоже, он хорошо подходит для проекта, поэтому я продолжу его. Благодарю. – RutledgePaulV

Смежные вопросы