2011-12-29 19 views
3

これは非常に簡単な例です。この例ではMyPropertyインターフェイスのインターフェイスプロパティを実装する派生クラスの具象プロパティを許可しない理由は何ですか?

public interface IMyInterfaceProperty 
{ 
} 

public class MyProperty : IMyInterfaceProperty 
{ 
} 

public interface IMyInterface 
{ 
    IMyInterfaceProperty SomeProperty { get; set; } 
} 

public class MyClass : IMyInterface 
{ 
    public MyProperty SomeProperty { get; set; } 
} 

IMyInterfacePropertyから誘導されるが、許可されていません。これをコンパイルできないという背後にある思考プロセスは何でしたか?

Program.MyClassは、インターフェイスメンバProgram.IMyInterface.SomePropertyを実装していません。​​は一致する戻り値の型がProgram.IMyInterfacePropertyではないため、Program.IMyInterface.SomePropertyを実装できません。

答えて

4

であっても、次が許可されていません。

public interface IMyInterface 
{ 
    IMyInterfaceProperty SomeProperty { get; set; } 
    MyProperty SomeProperty { get; set; } 
} 

は、私はその理由は、同じシグネチャを持つメンバーがタイプで許可されていないということだと思います。

メソッドのシグネチャは、特にリターン タイプが含まれていません。また、最も右のパラメータに を指定することができるのparams修飾子を含まない:そして、戻り値はここでは考慮されていません。

http://msdn.microsoft.com/en-us/library/aa691131(v=vs.71).aspxから。それはVS2003のためですが、私は:)それらの時以降に変更されたことはないと思う)

+0

質問がコンパイラエラーを含むように更新されました。 –

+0

実装されるメソッドは、同じシグネチャと戻り値を持つ必要があります。異なる戻り値が必要な場合は、ジェネリックを使うことができます: 'T SomeProperty {get;セット; } ' –

+0

これは、ASP.Net MVCに関連して、デフォルトのモデルバインダーは、値を設定するためのインターフェイスを作成できません(コンストラクタで、MVCに手動で具体的なクラスを設定する必要がありますクラスをインスタンス化してください)。 –

3

それは、タイプセーフではないので。

MyClassIMyInterfaceを実装する場合、MyClassのインスタンスはIMyInterface変数(リスコフの置換原則)で動作できる必要があります。のは、それが何を意味するのか見てみましょう:

あなたが定義したタイプに加えて、我々はまた、想定しています

public class EvilProperty : IMyInterfaceProperty {} 

public static class X 
{ 
    public static void EvilMethod(IMyInterface a, IMyInterfaceProperty b) 
    { 
     a.SomeProperty = b; 
    } 
} 

さて、ここでコール(自分を引き締める!)です:

X.EvilMethod(new MyClass(), new EvilProperty()); 

を参照してくださいが何が起こるか?このメソッドは、EvilPropertyのインスタンスをMyClassインスタンスのSomePropertyに割り当てますが、そのプロパティはMyPropertyを想定しており、EvilPropertyMyPropertyを継承しません。

関連する問題