2010-01-17 4 views
2

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

У меня есть этот интерфейс

public interface IFoo<T> 
{ 
    T Value(); 
} 

с этим члены

public class Bar : IFoo<string> 
{ 
    string Value(){return "test";} 
} 
public class Bar2 : IFoo<int> 
{ 
    int Value(){return "1";} 
} 

Это работает отлично, но теперь я хочу, чтобы сделать класс, который имеет свойство, которое может быть либо бар или BAR2 так как это

public class Test 
{ 
    IFoo test; 
} 

Только это не скомпилируется, потому что Ifoo должен иметь общий тип. Только я не знаю заранее, буду ли я использовать Bar2 или Bar.

Надеюсь, я объяснил это хорошо, но если нет, я постараюсь сделать это более ясным.

Explaination

Я пытаюсь (только ради прикольных), чтобы создать апи Dicom (медицинских изображений и т.д.). Часть стандарта dicom - это ValueRepresentations (VR). Это типы, которые используются для хранения (мета) информации об изображении.

Такие VR представляют собой, например: AgeString, Date, UnsignedShort, SequenceOfItems.

Для всех этих VR я хочу иметь некоторые методы, которые все они должны реализовать (кодирование и т. Д.). Но я все хочу, чтобы они могли хранить ценность. Является ли это Int, или DateTime или String, не следует ли это помещать в интерфейс?

+0

Если вы не знаете, впереди какой тип поля будет, то вы должны использовать объект. –

ответ

1

Вы всегда можете сделать общий интерфейс, таким же образом, что есть IEnumerable<T> и IEnumerable.

public interface IFoo 
{ 
    object Value(); 
} 

Реализация

public class Bar : IFoo<string>, IFoo 
{ 
    public string Value(){return "test";} 
    object IFoo.Value(){return Value();} 
} 
public class Bar2 : IFoo<int>, IFoo 
{ 
    public int Value(){return 1;} 
    object IFoo.Value(){return Value();} 
} 

Тест

IFoo b = new Bar(); 
IFoo b2 = new Bar2(); 
Console.WriteLine(b.Value()); 
Console.WriteLine(b2.Value()); 
+0

Я пробовал что-то подобное, но ты немного обманываешься, не так ли?Помните, что 'IEnumerable : IEnumerable', но ваш' IFoo 'не реализует' IFoo' - то есть, каждый класс, который реализует 'IFoo ', должен также * неявно * реализовать 'IFoo'. – Kobi

+0

Это не обман, я просто забыл. :) IFoo не должен реализовывать IFoo, но это, вероятно, должно быть. –

4

Вы должны сделать свой класс Test родовое, а также:

public class Test<T> 
{ 
    IFoo<T> test; 
} 
+0

Спасибо, это сделал трюк. Только я только понял, что я должен задать другой вопрос: P –

1

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

Вам действительно нужно строго указать тип возвращаемого значения метода? Как бы вы обрабатывали разные типы возвращаемых данных в классе Test? Подумайте об этом, и вы поймете, что достаточно вернуть объект. В противном случае вам необходимо также создать класс Test.

С наилучшими пожеланиями
Оливер Hanappi

+0

Я дал объяснение в своем оригинальном посте. ^^ Большое спасибо! –

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