0

こんにちは、私はこれらの概念を理解していると思っていましたが、もうわかりません。

私が次のものを持っているとしましょう:

インターフェース

public interface IUnit
{
    DateTime CreatedDateTime { get; set; }
}

基本クラス

public abstract class UnitBase : IUnit
{
    public virtual DateTime CreatedDateTime
    {
        get;
        protected set;
    }
    DateTime IUnit.CreatedDateTime
    {
        get
        {
            return CreatedDateTime;
        }
        set
        {
            CreatedDateTime = value;
        }
    }
}

次に、UnitBase から継承する別のクラスがあります。

public class NewClass : UnitBase
{
}

NewClass には、UnitBase から継承されているため、CreatedDateTime のプロパティが含まれています。また、NewClass はそれをオーバーライドしていないため、set の保護されたアクセサーがまだあると思います。

したがって、NewClass の新しいインスタンスを作成する場合:

NewClass obj = new NewClass();
obj.CreatedDateTime = DateTime.Now;  //This is not allowed 

しかし、obj を IUnit にキャストして変更できるのはなぜですか?

//like this
((IUnit)obj).CreatedDateTime = DateTime.Now  //Allowed?

保護されたセットは、宣言されたクラス (UnitBase) とそれから継承されたクラス (NewClass) のスコープでのみ値を設定できると思いました。では、どうしてキャストしてそのように変更できるのでしょうか。それが許可されている場合、保護されたセットのポイントは何ですか? ここで何が起こっているのかよくわかりません。誰か説明してくれませんか?

編集:コードを変更しました。今すぐコンパイルする必要があります。それで、それを IUnit にキャストして値を変更できたら、保護されたセットの目的を無効にしないでしょうか? インターフェイスの修飾子を変更して、IUnit にキャストして値を変更できないようにすることはできますか?

4

3 に答える 3

0

objIUnitandにキャストする限りIUnit、コンパイラはそれを として扱うIUnitのでCreateDateTime、何も問題も特別なこともありません。

さらに、コードはコンパイルされません。UnitBaseを実装していないためですIUnit。探しているものに到達するには、次のように編集できますUnitBase

public class UnitBase : IUnit
{
    public DateTime CreateDateTime { get; protected set; }

    DateTime IUnit.CreatedDateTime
    {
        get; set;
    }
}
于 2013-04-26T17:14:20.293 に答える