无法在C#中传递子接口作为参数

时间:2017-01-23 07:10:39

标签: c# inheritance parameters interface

我有以下界面层次结构:

public interface IActor { ... }
public interface IHealthUser : IActor { ... }

和第三个界面:

public interface IAction { void Perform(IActor caster) }

为什么以下情况不合法?我可以以某种方式绕过它吗?

public class HealthPotion : IAction
{
    public void Perform(IHealthUser caster) { ... }
}

2 个答案:

答案 0 :(得分:6)

IAction定义的合同规定您可Perform对任何IActor采取行动。 任何 IActor。不仅IHealthUserHealthPotion。您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 的类来调用它。