Мне нужен совет, как решить эту проблему.
У нас есть компонент, который отображает диаграммы и использует для этого определение:
public interface IChartDefinition
{
IAxisDefinition AxisDefinition { get; }
}
public interface IAxisDefinition
{
}
Это в отдельном проекте.
И в нашем приложении мы создали конкретную реализацию:
class CustomChartDefinition : IChartDefinition
{
public IAxisDefinition AxisDefinition { get; }
}
class CustomAxisDefinition : IAxisDefinition
{
private Descriptor DataDescriptor { get; set; }
}
Обратите внимание на дополнительное свойство Descriptor для CustomAxisDefinition .
С позиции компонентов все в порядке, как и должно быть.
Но учтите, что нам нужно пользовательское поведение, которое использует CustomChartDefinition в качестве входных данных и требует доступа к DataDescriptor . Прямой доступ к нему невозможен, поскольку CustomChartDefinition содержит IAxisDefinition вместо CustomAxisDefinition . Это не было бы проблемой, если бы C# поддерживал ковариацию возвращаемого типа, к сожалению, это не так.
Помимо приведения я нашел несколько решений для StackOverflow, но у каждого из них есть несколько недостатков:
- Использование дженериков. Это выглядит как хорошее решение, но вскоре приведет к тому, что определение generi c будет очень длинным. В моем примере мне нужно заменить IChartDefinition на IChartDefinition . Это было бы проблемой, но IAxisDefinion может содержать свойства, которые должны решить ту же проблему, которая может вскоре превратиться в нечто вроде IChartDefinition > . И вот как должно быть определено любое поле для определения диаграммы.
- Использование второго свойства с типом Speci c, но это дублирует код.
- Использование new ключевое слово для производного класса, но оно почти равно 2 и имеет те же недостатки.
Поскольку ковариация возвращаемого типа была предложена, поскольку C# имеет длительное время go, но пока не имеет Я считаю, что должно быть более приятное решение, которое я не нашел.
Или, может быть, в моем дизайне IChartDefinition .
есть благодарность Любой совет, как подойти к этой проблеме.