Общие элементы интерфейса

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";}
}

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

public class Test
{
  IFoo test;
}

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

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

Explaination

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

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

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

  • 0
    Если вы заранее не знаете, какой тип поля, тогда вы должны использовать объект.
Теги:
generics
interface

3 ответа

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<T> : IEnumerable , но ваш IFoo<T> не реализует IFoo то есть каждый класс, реализующий IFoo<T> должен также неявно реализовывать IFoo .
  • 0
    Это не обман, я просто забыл. :) IFoo <T> не должен реализовывать IFoo, но, вероятно, должен.
4

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

public class Test<T>
{
   IFoo<T> test;
}
  • 0
    Спасибо, это помогло. Только я только понял, что мне нужно задать другой вопрос: P
1

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

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

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

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

Ещё вопросы

Сообщество Overcoder
Наверх
Меню