当前位置:  开发笔记 > 编程语言 > 正文

有没有办法从派生类型到达另一个对象的`protected`成员?

如何解决《有没有办法从派生类型到达另一个对象的`protected`成员?》经验,为你挑选了3个好方法。

上次我遇到类似问题时,我使用了向基础添加受保护静态方法的解决方案:

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.



1> Medinoc..:

上次我遇到类似问题时,我使用了向基础添加受保护静态方法的解决方案:

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);
    }
}



2> Jon Skeet..:

不,你不能这样做.

您只能访问访问类型(或从中派生)的对象的受保护成员.在这里,我们不知道参数是MyType类型还是SomeOtherCompletelyDifferentType类型.

编辑:C#3.0规范的相关部分是第3.5.3节:

当在声明它的类的程序文本之外访问受保护的实例成员时,并且当在声明它的程序的程序文本之外访问受保护的内部实例成员时,访问必须在类中进行声明派生自声明它的类.此外,需要通过该派生类类型的实例或从其构造的类类型进行访问.此限制可防止一个派生类访问其他派生类的受保护成员,即使这些成员是从同一基类继承的.


我们不知道它是MyType还是SomeOtherCompletelyDifferentType,但我们知道它是MyBase,我们知道MyBase有一个名为PropertyOfBase的属性,所以它对我来说仍然有意义.

3> Jay Bazuzi..:

有一个很好的理由你不能这样做.假设某人写道:

class Other : MyBase { }

new MyType().MyMethod(new Other());

如果语言允许您要求的内容,则可以Other通过修改值来违反假定的不变量PropertyOfBase.

推荐阅读
LEEstarmmmmm
这个屌丝很懒,什么也没留下!
DevBox开发工具箱 | 专业的在线开发工具网站    京公网安备 11010802040832号  |  京ICP备19059560号-6
Copyright © 1998 - 2020 DevBox.CN. All Rights Reserved devBox.cn 开发工具箱 版权所有