, вероятно, легко, но, пожалуйста, взгляните на следующие классы / интерфейсы:
public interface IChallenge
public interface IChallengeView<T> where T : IChallenge
{
T Challenge {get;set;}
}
public interface IChallengeHostView
{
IChallengeView<IChallenge> ChallengeView { get; set; }
}
public class AdditionChallenge : IChallenge {}
public class AdditionChallengeView: IChallengeView<AdditionChallenge> {}
Сценарий представляет собой дидактическое приложение для детей младшего возраста.Я намерен сохранить гибкость приложения, отделяя хост (который может быть любым графическим окружением) от задачи, которая должна быть решена.Таким образом, я мог бы использовать одно и то же окружение для размещения сложения, умножения, деления ...
Теперь, когда я хочу заполнить это какой-то жизнью, у меня возникает проблема с преобразованием:
HostView hostView = new HostView(); // implements IChallengeHostView
AdditionChallengeView challengeView = new AdditionChallengeView();
hostView.ChallengeView = challengeView;
Это, конечно, не работает.Я понимаю, почему это не так, но я понятия не имею, как обойти это.
Есть идеи?
ОБНОВЛЕНИЕ : я решил опубликовать как можно меньше кодакак можно раньше, но это привело меня к проблеме сокрытия одной проблемы от вас, ребята: интерфейс IChallengeView имеет настраиваемое свойство (теперь видно в коде выше), что делает ковариациюздесь невозможно применить - параметр универсального типа может быть только инвариантным в этом случае.
Ответ, данный rich.okelly, является правильным, но основан на ложных предположениях (которые, опять же, были основаны на плохом уровнеподробности приведены в моем описании здесь).
Я решил сделать код немного менее адгезивным по типу реализации, например так:
public interface IChallenge
public interface IChallengeView
{
IChallenge Challenge {get;set;}
}
public interface IChallengeHostView
{
IChallengeView ChallengeView { get; set; }
}
public class AdditionChallenge : IChallenge {}
public class AdditionChallengeView: IChallengeView {}
Это означает, что у меня есть еще немного кода приведения вAdditionChallengeView (и все другие реализующие классы), но мне кажется, что это единственный жизнеспособный способ в то время.