实现接口时
public interface IMainViewModel
{
ICommand DoStuffCommand { get; }
}
为什么
public class MainViewModel
{
DelegateCommand DoStuffCommand { get; }
}
使用
public class DelegateCommand : ICommand { ... }
不允许?
属性
DoStuffCommand
无法通过接口IMainViewModel
实现属性。类型应为ICommand
。
在DelegateCommand
实现ICommand
时,界面合同保证我可以使用DelegateCommand
完全相同的方式我可以使用任何ICommand
。
我想知道为什么接口接口属性不能用具体的类型实现,因为从我的角度来看,我不会认为它是错误的(或行为改变或功能破坏)。
答案 0 :(得分:5)
这只是规则。除通用协方差/反方差之外,签名(包括返回类型 1 )必须完全匹配。您当然可以随意添加第二个方法,该方法显式实现该接口并只包装当前的DoStuffCommand
,以便显式使用MainViewModel
对象的调用者可以轻松获得DelegateCommand
而无需投射和通过IMainViewModel
引用使用它的人都不是明智的选择:
public class MainViewModel : IMainViewModel
{
DelegateCommand DoStuffCommand { get; }
ICommand IMainViewModel.DoStuffCommand => DoStuffCommand;
}
1 我的一个小错误是当人们指出“返回类型不是C#签名的一部分”时。它们的实际含义是“出于超载的目的,不考虑返回类型”。在很多地方,例如这里,返回类型都是签名的一部分。