嗨,我以为我正在理解这些概念,但我不确定了。
假设我有以下内容:
界面
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 包含 CreatedDateTime 的属性,因为它继承自 UnitBase,并且由于 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 并修改值吗?