加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 百科 > 正文

c# – 如果兄弟姐妹不能,父母为什么可以访问子类’受保护成员的

发布时间:2020-12-15 08:16:01 所属栏目:百科 来源:网络整理
导读:如 this question和 these articles中所述,不允许以下内容: public class A{ protected virtual int X {get; private set;}}public class B : A{ public int Add(A other) { return X + other.X; }} 因为如果是,你有这个: public class C : A { protected
如 this question和 these articles中所述,不允许以下内容:
public class A
{
    protected virtual int X {get; private set;}
}

public class B : A
{
    public int Add(A other)
    {
        return X + other.X;
    }
}

因为如果是,你有这个:

public class C : A 
{  
    protected override int X { get { return 4; } }
}

然后:

A c = new C();
B b = new B();
b.Add(c);

这是非法的,因为即使B访问X意味着它知道C具有所需的签名,但仍然不允许实际访问该成员.

到现在为止还挺好.但鉴于上述情况,我很困惑的是为什么我能做到这一点:

public class A
{
    protected virtual int X { get; private set; }

    public int Add(A other)
    {
        return X + other.X;
    }
}

因此,这个:

A c = new C();
A a = new A();
a.Add(c);

definition of the protected keyword说:

A protected member is accessible within its class and by derived class instances.

但是现在C上的受保护成员正在从A中访问,它既不是“它的类”也不是“派生类实例”,而是父类.虽然A显然可以访问签名,但兄弟姐妹的例子似乎表明单独这一点不应该足够,那么为什么保护它授予它访问该成员?

解决方法

作为C的作者,我可以选择我的基类.所以我找到了A,我已经阅读了它的文档,我知道它将如何以及为什么会调用我继承的任何受保护成员(当然,我有选项,比如密封或保护我的构造函数来控制哪些类,如果任何,都可以来自我的C).这就是我真正需要考虑的事情(在反射/完全控制场景之外,但是一旦反射出现在图片中,所有投注都将被取消).

我不必担心的是其他人决定他们想要调用那些受保护的方法.哪个(根据你提出的修改),他们只需创建自己的类B,就可以从A中派生出来.

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读