Я задал этот вопрос вчера и получил много хороших ответов, только я только понял, что мой вопрос был неправильным, и здесь я хочу перефразировать его.
У меня есть этот интерфейс
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, не следует ли это помещать в интерфейс?
Вы всегда можете создать общий интерфейс, так же, как 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());
IEnumerable<T> : IEnumerable
, но ваш IFoo<T>
не реализует IFoo
то есть каждый класс, реализующий IFoo<T>
должен также неявно реализовывать IFoo
.
Вы также должны создать свой тестовый класс:
public class Test<T>
{
IFoo<T> test;
}
Вы хотите использовать два разных класса одинаково, но вы позволяете им реализовывать разные интерфейсы (разные по их параметру типа). Почему?
Вам действительно нужно строго указать тип возвращаемого значения метода? Как бы вы обрабатывали разные типы возвращаемых данных в классе Test? Подумайте об этом, и вы поймете, что достаточно вернуть объект. В противном случае вам необходимо также создать класс Test.
С наилучшими пожеланиями - Оливер Ханаппи