我有以下界面层次结构:
public interface IActor { ... }
public interface IHealthUser : IActor { ... }
和第三个界面:
public interface IAction { void Perform(IActor caster) }
为什么以下情况不合法?我可以以某种方式绕过它吗?
public class HealthPotion : IAction
{
public void Perform(IHealthUser caster) { ... }
}
答案 0 :(得分:6)
IAction
定义的合同规定您可Perform
对任何IActor
采取行动。 任何 IActor。不仅IHealthUser
。HealthPotion
。您IAction
尝试执行的操作仅实现IActor
的子集,这意味着仅在IAction
的子集上执行其任务。那不是IAction
界面所说的。
如果您希望特定IActor
能够限制其适用的public interface IAction<TAppliesTo> where TAppliesTo : IActor
{
void Perform(TAppliesTo appliesTo);
}
public class UniversalAction : IAction<IActor>
{
public void Perform (IActor anyone) {}
}
public class HealthPotion : IAction<IHealthUser>
{
public void Perform (IHealthUser healthUserOnly){}
}
类型,您可以使用通用约束来执行此操作:
angular.module('myApp.constants', []).constant('const', {username: 'abc'});
答案 1 :(得分:2)
您需要实现与接口定义的相同的签名。您在界面中使用 IActor ,但在 IAction 界面的实施中使用了 IHealthUser 。您应该使用 IActor 参数实施执行。但是可以使用实现 IHealthUser 的类来调用它。