2017-01-23 7 views
1

にパラメータとしてサブインターフェイスを渡すことはできません:は、私は次のインターフェイスの階層を持つC#の

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

と第3のインタフェース:

public interface IAction { void Perform(IActor caster) } 

法的ない追従していると私は周りに取得することができますなぜどういうわけか?

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

@ZoharPeled「『HealthPotion』「IActionをメンバーを実装していません。実行(IActor) ' – user1323245

答えて

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){} 
} 
+1

もちろん、IHealthUserは派生したインターフェイスなので、実際にやっていたのはIActionの実装をより制限していたからです。オプションの仕事の不思議。 – user1323245

2

インターフェイスで定義されているのと同じ署名を実装する必要があります。インターフェイスでIActorを使用していますが、IHealthUserの実装ではIActionインターフェイスを使用しています。 を実行し、IActorパラメータを実装する必要があります。しかし、それは、IHealthUserを実装するクラスで呼び出すことができます。

関連する問題