こんにちは、私はこれらの概念を理解していると思っていましたが、もうわかりません。
私が次のものを持っているとしましょう:
インターフェース
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 にキャストして値を変更できないようにすることはできますか?