Обходной путь для ковариации типа возврата на свойствах C# - PullRequest
0 голосов
/ 26 марта 2020

Мне нужен совет, как решить эту проблему.

У нас есть компонент, который отображает диаграммы и использует для этого определение:

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, но у каждого из них есть несколько недостатков:

  1. Использование дженериков. Это выглядит как хорошее решение, но вскоре приведет к тому, что определение generi c будет очень длинным. В моем примере мне нужно заменить IChartDefinition на IChartDefinition . Это было бы проблемой, но IAxisDefinion может содержать свойства, которые должны решить ту же проблему, которая может вскоре превратиться в нечто вроде IChartDefinition > . И вот как должно быть определено любое поле для определения диаграммы.
  2. Использование второго свойства с типом Speci c, но это дублирует код.
  3. Использование new ключевое слово для производного класса, но оно почти равно 2 и имеет те же недостатки.

Поскольку ковариация возвращаемого типа была предложена, поскольку C# имеет длительное время go, но пока не имеет Я считаю, что должно быть более приятное решение, которое я не нашел.

Или, может быть, в моем дизайне IChartDefinition .

есть благодарность Любой совет, как подойти к этой проблеме.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...