Допустим, вы пишете библиотеку для отображения вещей на экране, поэтому вы создаете интерфейс IDisplayable
. Этот интерфейс имеет один метод для создания элемента управления из объекта: displayable.GetControl()
.
Вы хотите создать свой собственный тип списка, который может отображаться: MyList<T>
. Теперь этот список может отображаться только в том случае, если T
является IDisplayable
, поэтому вы можете спросить в классе MyList, что T должен реализовывать IDisplayable. Но вы также хотите использовать этот тип списка в некоторых местах, когда T не IDisplayable (и в результате этот список не будет отображаться). Так можно ли сказать, что MyList реализует IDisplayable, если T реализует IDisplayable? Я также был бы рад, если бы MyList<T>
всегда реализовывал IDisplayable, но выдавал исключение во время выполнения, если вы пытаетесь вызвать GetControl()
, если T не IDisplayable, но я хотел бы знать, есть ли статически безопасный для этого способ сделать это , Можно ли это сделать? Или я смотрю на неправильное решение?
Edit:
Я согласен с предложениями, что MyList может иметь слишком много обязанностей. Моей первоначальной идеей было создать MyDisplayableList<T> : MyList<T> (where T : IDisplayable)
.
Проблема этого подхода заключается в том, что у меня есть много методов, которые берут MyList и возвращают MyList (например, такие методы, как Select in Linq). Так что, если я использую select в MyDisplayableList, я получаю MyList, и я не могу отобразить его, даже если это MyList ... Есть ли безопасный тип решения этой проблемы в C #?