繁体   English   中英

访问派生的私有基类成员…通过派生类对象…在基类成员中创建

[英]Accessing inherited private base class member…through derived class object…created in base class member

我无法确定为什么如果x和y是私有的,为什么a类中的m()可以通过b类和b类对象访问x和y。 我知道,当b从a继承时,b将从a接收私有成员,即使b无法使用它们。 但是对我来说奇怪的是b成员不能使用x和y,a以外的其他类无法通过b类和b类对象获取变量,而m()可以通过b来访问x和y类和b类对象。

有人可以使用我遗漏的一般规则向我解释这一点,或者可能是关于编译器如何将这种“基本”成员“赋予”派生类的解释吗?

class a
{
    private int x;
    private static int y;

    static void m()
    {
        b bobj = new b();
        int mm = bobj.x;
        int rr = b.y;


    }

    void n()
    {
        b bobj = new b();
        int mm = bobj.x;
        int rr = b.y;
    }
}

class b : a
{
    private int u;
    private static int v;

    static void o()
    {

    }

    void p()
    {

    }
}

我无法确定为什么如果x和y是私有的,为什么a类中的m()可以通过b类和b类对象访问x和y

类声明中的代码可以访问该类声明的任何私有成员-就是这么简单。 因此,在代码中a不能访问声明为私有变量b ,但是它可以访问中声明私有变量a通过实例a这也恰好是实例b

注意这一行:

int rr = b.y;

有效地转换为

int rr = a.y;

y仅由a声明-如果它确实b声明,则将无法访问。

有关更多详细信息,请参见C#4语言规范的3.5节。

这是从C ++语言继承的规则。

privateprotected操作于类,而不是对象。 因此,例如,如果您有一个Bank对象,则其成员可以访问任何其他Bank的私有数据,尽管这似乎违反直觉或危险。

由于C ++广泛使用指针算术和无限制的类型转换,因此无法在任何代码在同一进程中执行之前可靠地保护进程内部的数据。

但是,如果只需要防止意外访问的对象级保护,则可以通过定义一个接口并仅在库之间传递接口来帮助您。 虽然Bank对象仍然可以执行以下操作:

void TransferMoneyFrom(IBank otherBank, decimal theirAccountNumber,
                        decimal receivingAccountNumber, int amount)
{
    ((Bank)otherBank).PrivateProperty = whatever;
}

...这不太可能无意间发生,因为需要显式类型转换或使用反射。

(请注意,使用C#通常可以更轻松地有意访问您没有源代码的其他某些的私有成员(按名称,使用反射)。如​​果该类型的供应商认为这是不利的,则可以使用混淆器,使它变得更加困难。这仍然不能以任何方式保护被混淆的对象免受其自身其他实例的侵害。)

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM