Общие элементы интерфейса - PullRequest
2 голосов
/ 17 января 2010

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

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

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

С этими членами

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

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

public class Test
{
  IFoo test;
}

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

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

Explaination

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

Например, такие VR: AgeString, Date, UnsignedShort, SequenceOfItems.

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

Ответы [ 3 ]

4 голосов
/ 17 января 2010

Вы также должны сделать свой тестовый класс общим:

public class Test<T>
{
   IFoo<T> test;
}
1 голос
/ 17 января 2010

Вы всегда можете сделать общий интерфейс, точно так же, как есть 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();}
}

Test

IFoo b = new Bar();
IFoo b2 = new Bar2();
Console.WriteLine(b.Value());
Console.WriteLine(b2.Value());
1 голос
/ 17 января 2010

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

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

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

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