C# 无法在C中将子接口作为参数传递#
我有以下接口层次结构:C# 无法在C中将子接口作为参数传递#,c#,inheritance,parameters,interface,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(IHealthUse
public interface IActor { ... }
public interface IHealthUser : IActor { ... }
以及第三个接口:
public interface IAction { void Perform(IActor caster) }
为什么下面的内容不合法,我可以绕开它吗
public class HealthPotion : IAction
{
public void Perform(IHealthUser caster) { ... }
}
您需要实现与接口定义相同的签名。您在界面中使用了IActor,但在IAction界面的实现中使用了IHealthUser。您应该使用IActor参数实现执行。但是,可以使用实现IHealthUser的类调用它。您需要实现与接口定义相同的签名。您在界面中使用了IActor,但在IAction界面的实现中使用了IHealthUser。您应该使用IActor参数实现Perform。但是,它可以通过实现IHealthUser的类调用,
IAction
定义的契约声明您可以对任何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){}
}
公共接口IAction,其中TAppliesTo:IActor
{
无效执行(Tapplies to appliesTo);
}
公共类通用性:IAction
{
公共无效执行(IActor ANYONY){}
}
公共级保健药水:IAction
{
public void Perform(IHealthUser healthUserOnly){}
}
由IAction
定义的合同规定,您可以对任何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){}
}
公共接口IAction,其中TAppliesTo:IActor
{
无效执行(Tapplies to appliesTo);
}
公共类通用性:IAction
{
公共无效执行(IActor ANYONY){}
}
公共级保健药水:IAction
{
public void Perform(IHealthUser healthUserOnly){}
}
@ZoharPeled“'HealthPotion'不实现成员'IAction.Perform(IActor)'@ZoharPeled”'HealthPotion'当然不实现成员'IAction.Perform(IActor)'!我被困在“IHealthUser是一个派生接口,它应该可以工作!”的心态中,而实际上我所做的是使IAction实现受到更大的限制。你说得很好,通用选项也很神奇。当然!我被困在“IHealthUser是一个派生接口,它应该可以工作!”的心态中,而实际上我所做的是使IAction实现受到更大的限制。你把它说得很好,而通用选项的效果很好。