作者:阵风阿斯顿 | 来源:互联网 | 2022-12-03 10:22
实现界面时
public interface IMainViewModel
{
ICommand DoStuffCommand { get; }
}
为什么是
public class MainViewModel
{
DelegateCommand DoStuffCommand { get; }
}
同
public class DelegateCommand : ICommand { ... }
不允许?
属性DoStuffCommand
无法从接口实现属性IMainViewModel
.类型应该是ICommand
.
作为DelegateCommand
实现ICommand
,接口契约保证我能够使用DelegateCommand
完全相同的方式使用any ICommand
.
我想知道为什么接口interface-property不能用具体类型实现,因为从我的观点来看,我不认为它是错误的(或改变行为或破坏功能).
1> Damien_The_U..:
他们只是规则.在通用的共同/反向差异之外,签名(包括返回类型1)必须完全匹配.你当然可以自由地添加第二个显式实现接口的方法,只是包装你的当前信息,DoStuffCommand
以便明确使用MainViewModel
对象的调用者可以很容易地获得DelegateCommand
没有强制转换,而那些通过IMainViewModel
引用使用它的人更聪明:
public class MainViewModel : IMainViewModel
{
DelegateCommand DoStuffCommand { get; }
ICommand IMainViewModel.DoStuffCommand => DoStuffCommand;
}
1我个人的一个问题是人们说"返回类型不是C#中签名的一部分".它们实际上意味着"为了超载的目的,不考虑返回类型".有很多地方,例如这里,返回类型是签名的一部分.