上次我遇到类似问题时,我使用了向基础添加受保护静态方法的解决方案:
class MyBase
{
protected object PropertyOfBase { get; set; }
protected static object GetPropertyOfBaseOf(MyBase obj)
{
return obj.PropertyOfBase;
}
}
class MyType : MyBase
{
void MyMethod(MyBase parameter)
{
object p = GetPropertyOfBaseOf(parameter);
}
}
Jon Skeet.. 11
不,你不能这样做.
您只能访问访问类型(或从中派生)的对象的受保护成员.在这里,我们不知道参数是MyType类型还是SomeOtherCompletelyDifferentType类型.
编辑:C#3.0规范的相关部分是第3.5.3节:
当在声明它的类的程序文本之外访问受保护的实例成员时,并且当在声明它的程序的程序文本之外访问受保护的内部实例成员时,访问必须在类中进行声明派生自声明它的类.此外,需要通过该派生类类型的实例或从其构造的类类型进行访问.此限制可防止一个派生类访问其他派生类的受保护成员,即使这些成员是从同一基类继承的.
我们不知道它是MyType还是SomeOtherCompletelyDifferentType,但我们知道它是MyBase,我们知道MyBase有一个名为PropertyOfBase的属性,所以它对我来说仍然有意义. (3认同)
Jay Bazuzi.. 5
有一个很好的理由你不能这样做.假设某人写道:
class Other : MyBase { } new MyType().MyMethod(new Other());
如果语言允许您要求的内容,则可以Other
通过修改值来违反假定的不变量PropertyOfBase
.
上次我遇到类似问题时,我使用了向基础添加受保护静态方法的解决方案:
class MyBase
{
protected object PropertyOfBase { get; set; }
protected static object GetPropertyOfBaseOf(MyBase obj)
{
return obj.PropertyOfBase;
}
}
class MyType : MyBase
{
void MyMethod(MyBase parameter)
{
object p = GetPropertyOfBaseOf(parameter);
}
}
不,你不能这样做.
您只能访问访问类型(或从中派生)的对象的受保护成员.在这里,我们不知道参数是MyType类型还是SomeOtherCompletelyDifferentType类型.
编辑:C#3.0规范的相关部分是第3.5.3节:
当在声明它的类的程序文本之外访问受保护的实例成员时,并且当在声明它的程序的程序文本之外访问受保护的内部实例成员时,访问必须在类中进行声明派生自声明它的类.此外,需要通过该派生类类型的实例或从其构造的类类型进行访问.此限制可防止一个派生类访问其他派生类的受保护成员,即使这些成员是从同一基类继承的.
有一个很好的理由你不能这样做.假设某人写道:
class Other : MyBase { } new MyType().MyMethod(new Other());
如果语言允许您要求的内容,则可以Other
通过修改值来违反假定的不变量PropertyOfBase
.