0

x と y が非公開の場合、クラス a の m() が b クラスと b クラスのオブジェクトを介して x と y にアクセスできる理由を理解できません。b が a から継承する場合、b はプライベート メンバーを使用できなくても、b は a からプライベート メンバーを受け取ることを知っています。しかし、私にとって奇妙なのは、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()
    {

    }
}
4

2 に答える 2

3

x と y が非公開の場合、クラス a の m() が b クラスと b クラス オブジェクトを介して x と y にアクセスできる理由について頭を悩ませることはできません

クラス宣言内のコードは、そのクラスによって宣言されたすべてのプライベート メンバーにアクセスできます。それはそれと同じくらい簡単です。したがって、 内のコードは で宣言されたaプライベート変数にアクセスできませんが、 のインスタンスでもある のインスタンスを介して で宣言されたプライベート変数にアクセスできます。baab

次の行に注意してください。

int rr = b.y;

に効果的に変換されます。

int rr = a.y;

yによってのみ宣言されますa-によって実際に宣言された場合b、アクセスできません。

詳細については、C# 4 言語仕様のセクション 3.5 を参照してください。

于 2012-06-10T15:37:15.387 に答える
0

これは C++ 言語から継承された規則です。

privateprotectedオブジェクトではなく、クラスを操作します。したがって、たとえば、オブジェクトがある場合、直感に反するか危険に見えるかもしれませんがBank、そのメンバーは他の のプライベート データにアクセスできます。Bank

C++ ではポインター演算と無制限の型キャストが広く使用されていたため、同じプロセスでコードが実行される前に、プロセス内のデータを確実に保護する方法がありませんでした。

ただし、偶発的なアクセスからオブジェクト レベルの保護のみが必要な場合は、インターフェイスを定義し、バンク間でのみインターフェイスを渡すことで、これを支援できます。オブジェクトはBank引き続き次のことを実行できます。

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

...明示的な型キャストまたはリフレクションの使用が必要なため、意図せずに発生する可能性は低くなります。

(通常、C# を使用すると、ソース コードを持っていない他のクラスのプライベート メンバーに (リフレクションを使用して名前で)意図的に簡単にアクセスできることに注意してください。これがその型のベンダーによって不利であると認識された場合、彼らは使用できます。これをより困難にする難読化ツール. これは、難読化されたオブジェクトをそれ自体の他のインスタンスから保護するものではありません.)

于 2012-06-10T15:38:53.883 に答える