Почему свойства интерфейса, содержащие тип интерфейса, не могут быть реализованы с помощью свойства, содержащего конкретный тип, который реализует интерфейс? - PullRequest
0 голосов
/ 04 октября 2018

При реализации интерфейса

public interface IMainViewModel
{
    ICommand DoStuffCommand { get; }
}

почему

public class MainViewModel
{
    DelegateCommand DoStuffCommand { get; }
}

с

public class DelegateCommand : ICommand { ... }

не разрешено?

СвойствоDoStuffCommand не может реализовать свойство из интерфейса IMainViewModel.Тип должен быть ICommand.


Поскольку DelegateCommand реализует ICommand, интерфейс контракт гарантирует , что я могу использовать DelegateCommand точно так же Я могу использовать любой ICommand.


Я хотел бы знать, почему интерфейсное свойство интерфейса не может быть реализовано с конкретным типом, как я бы не подумалэто неправильно (или изменение поведения, или нарушение функциональности) с моей точки зрения.

1 Ответ

0 голосов
/ 04 октября 2018

Это просто правила.За пределами общей ко-/ противо-дисперсии сигнатуры (, включая типы возврата 1 ) должны точно совпадать.Вы, конечно, можете добавить второй метод, который явно реализует интерфейс и просто оборачивает ваш текущий DoStuffCommand, чтобы вызывающие, которые явно работают с объектом MainViewModel, могли легко получить DelegateCommand без приведения и тех, кто использует его черезссылка IMainViewModel не является мудрой:

public class MainViewModel : IMainViewModel
{
    DelegateCommand DoStuffCommand { get; }
    ICommand IMainViewModel.DoStuffCommand => DoStuffCommand;
}

1 Один из моих личных ошибок - когда люди утверждают, что «возвращаемые типы не являются частью подписи вC #».На самом деле они имеют в виду «в целях перегрузки типы возвращаемых данных не учитываются».Есть много мест, например, здесь, где типы возврата являются частью подписи.

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