5

Type.GetProperty(string)型がインターフェイスの場合、なぜ基本インターフェイスからプロパティを取得しないのですか? たとえば、次のコードは次のように表示されます。

System.String X
null
System.String X
System.String X

矛盾しているようです:

void Main()
{
    Console.WriteLine(typeof(I1).GetProperty("X"));
    Console.WriteLine(typeof(I2).GetProperty("X"));
    Console.WriteLine(typeof(C1).GetProperty("X"));
    Console.WriteLine(typeof(C2).GetProperty("X"));;
}

public interface I1 { string X { get; } }

public interface I2 : I1 { }

public class C1 { public string X { get { return "x"; } } }

public class C2 : C1 { }

編集:コールの答えをサポートするランタイムの別の側面は次のとおりです。

public class C : I2 {
    // not allowed: the error is
    // 'I2.X' in explicit interface declaration is not a member of interface
    string I2.X { get; set; }

    // allowed
    string I1.X { get; set; }
}
4

1 に答える 1

6

クラスの継承はインターフェースの実装と同じではないことに注意してください。

派生クラスとその基本クラスにはis-a関係があります。その場合D : BD です BBがプロパティを持っている場合、それはその関係が意味するDものであるため、定義上、同じプロパティも持ちます。の「実体」は、ある意味で。との関係によって変更されます。DB

インターフェースは実装を提供しないので、あなたが言うときID : IB、あなたは実際にはあなたがクラスで行うのと同じ方法であるID と言っているわけではありません。 IBそれはどういう意味ですか? IDそして物でIBはありませ; それらは合意です。変更するものは何もありません。ID代わりに、「実装するクラスは、の実装も提供する必要があります」と言っていますIB

IDから派生するという事実は、変更する実質がないため、IB変更されませんID。これは、によって指定された契約を履行することを約束するクラスIDも、追加の一連の要件に準拠するように準備する必要があることを意味します。

これを念頭に置いてIB、プロパティを提供する場合、「プロパティはありますか?」Xに対する適切な答え。いいえです。 を実装する必要があります。これにはプロパティがありますが、それ自体にはプロパティがありませIDXIDIBXX

于 2013-03-14T21:04:03.447 に答える