2010-05-12 2 views
0

Я пытаюсь создать общий класс, который принимает 3 типа, либо простую строку, IList<string>, либо IList<OntologyStore>.Как создать общий класс, который принимает 3 типа

public class OntologyStore 
{ 
} 

public sealed class jim<T> where T:new() 
{ 
    string J; 
    IList<string> X = null; 
    IList<OntologyStore> X1 = null; 

    public jim() 
    { 
     if (typeof(T) == typeof(String)) 
     { 
      J = string.Empty; 
     } 
     if (typeof(T) == typeof(OntologyStore)) 
     { 
      X1 = new List<OntologyStore>(); 
     } 
     if (typeof(T)==typeof(IList)) 
     { 
      X = new List<string>(); 
     } 
    } 
} 

Я могу легко создать, которые можно было бы ожидать, чтобы работать,

jim<OntologyStore> x1=new jim<jim<OntologyStore>() 

, как можно было бы ожидать, но когда я ставлю в

jim<string> x2=new jim<string>() 

компилятор сообщает строка не является abtract, который вы ожидаете.

Возможно ли создать универсальный класс, который может быть создан как класс, который содержит строку, или IList<string> или IList<OntologyStore>?

+0

Вам действительно удалось смутить меня! Какую проблему ты пытаешься решить? – flq

+0

Было бы легче ответить на ваш вопрос, если бы вы назвали ваши классы чем-то иным, чем имена собственных. Это становится путаным со ссылкой на классы с именем 'jim' или' bob'. – LBushkin

+0

Игнорировать мой пост, вы обновили вопрос, пока я писал свой ответ. Я не уверен, что понимаю, что вы на самом деле пытаетесь сделать с этим классом. Я немного запутался в своей цели. – Toby

ответ

0

Вы не можете сделать это напрямую с помощью дженериков. Общие ограничения должны указывать один тип, который является ограничением для всех реализаций ... В вашем случае нет общего базового класса для System.String, IList<String> и IList<OntologyStore>, который является уникальным базовым классом или интерфейсом для этих типов (с System.Object и IEnumerable являются единственными стандартными базовыми типами, я считаю ...)

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

Одним из вариантов для предотвращения дублирования функциональности будет сделать базовый класс, и есть 3 фабричных методов, которые конструируют и возвращать подкласс для конкретного типа в вопросе:

public class Jim 
{ 
    protected Jim() {} 

    public Jim Create(string value) 
    { 
     return new StringJim(value); 
    } 

    private class StringJim : Jim 
    { 
     public StringJim(string value) { // ... 
     } 
    } 
    // Do same for IList<string> and IList<OntologyStore>.. 

    // Add common methods here... 
} 
1

Это само определение случая, когда вы не должны пытаться создать такой класс, но иметь интерфейс (или абстрактную базу) и вывести из него три разных конкретных класса.

1

Я думаю, ваша проблема должна сделать с тем фактом, что класс String не имеет открытого конструктора без параметров, как того требует ограничение «new()».

0

вы должны установить

общественного запечатаны класса джим, где T: класс, новый()

, если вы хотите использовать строковые также

смотрите здесь для получения дополнительной информации: http://msdn.microsoft.com/en-us/library/d5x73970.aspx

0

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

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

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