2017-01-23 62 views
1

我有以下接口層次:不能通過子接口參數在C#

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

和第三接口:

public interface IAction { void Perform(IActor caster) } 

爲什麼下面不合法,我可以得到解決不知何故?

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

@ZoharPeled「‘HealthPotion’不實現成員「IAction。 Perform(IActor)' – user1323245

回答

6

IAction定義的合同規定您可以在任何IActor上執行Perform動作。 任何 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){} 
} 
+1

當然,我被困在思維模式中,「IHealthUser是一個派生的接口,它應該工作!」,當我真正在做的是讓IAction實現更受限制。選項工作奇蹟。 – user1323245

2

您需要實現與接口定義相同的簽名。您正在使用IActor的界面,但接着您正在使用IHealthUser中執行IAction界面。您應該執行執行IActor參數。然而,可以使用實現IHealthUser的類來調用它。