-4

私はc++で知っていますが、継承は「パブリック」、「プライベート」、「保護」のいずれかであり、次のようにクラスAをクラスBにパブリックに継承するかどうかを意味します。

    class A
{
    public int pub1;
    private int prvt1;
    protected int proc1;
}


class B : public A
{

    //public int pub1;//This variable is because of inheritacne and is internal.
    //public int proc1;//This variable is because of inheritacne and is internal.
    public int pub2;
    private int prvt2;
    protected int pro2;
}

つまり、クラスAの2つの変数(pub1、proc1)は継承されましたが、アクセス指定子はパブリックです。しかし、C#では次のようになります

    class A
{
    public int pub1;
    private int prvt1;
    protected int proc1;
}


class B : A
{

    //public int pub1; //This variable is because of inheritacne and is internal.
    //protected int proc1;//This variable is because of inheritacne and is internal.
    public int pub2;
    private int prvt2;
    protected int pro2;
}

つまり、クラスAの2つの変数(pub1、proc1)が継承されましたが、アクセス指定子はクラスAにあったものと同じです。

なぜこの種の実装が.NETFrameworkで提供されているのですか。これの長所と短所は何ですか?

4

2 に答える 2

1

これはコメントかもしれませんが、コメント領域に収まるには大きすぎます。

私はあなたのクラス定義を取り、これを試しました-

class A
{
    public:
    int pub1;
    private:
    int prvt1;
    protected:
    int proc1;
};


class B : public A
{

    //public int pub1;//This variable is because of inheritacne and is internal.
    //public int proc1;//This variable is because of inheritacne and is internal.
    public:
    int pub2;
    private:
    int prvt2;
    protected:
    int pro2;
};

int main()
{
    B* b = new B();
    b->pub2 = 1;
    b->proc1 = 2;
}

コンパイラは私に吠えました-

prog.cpp: In function ‘int main()’:
prog.cpp:8:9: error: ‘int A::proc1’ is protected
prog.cpp:29:8: error: within this context

C++は保護されたメンバーをパブリックに変換しないと思います。それとも私は質問から何かが欠けていますか?

于 2013-03-26T06:20:33.367 に答える
1

この答えはC#についてのみです。

C#では、継承の「レベル」は1つだけであり、それは一種の「パブリック」継承です。クラスAには、次の5つの異なるアクセシビリティのメンバーを含めることができます。

class A
{
    public int pub1;
    private int prvt1;    // "private" keyword can be left out
    protected int proc1;
    internal int intnl1;
    protected internal int protintnl1;
}

publicorメンバーが継承されたprotected場合でも、派生クラスでまったく同じアクセシビリティがあります。メンバーが継承されるprivateと、派生クラスからアクセスできないため、ある意味でスーパープライベートになります。同様に、メンバーが別のアセンブリinternalの型に継承されると、内部メンバーは派生クラスから見えなくなります。

したがって、メンバーが別のアセンブリprotected internalのクラスによって派生すると、効果的になります。これは、メンバーがオーバーライドされたときに表示されます。例を考えてみましょう。protected

public class Ax
{
    protected internal virtual void Method()
    {
    }
}

そして、別のアセンブリの内部:

// Bx is in another assembly than Ax
class Bx : Ax
{
    protected override void Method()
    {
    }
}

Method事実上protected、新しいアセンブリの内部になっていることに注意してください。

の内部では、新しい(または)メンバーstructを宣言することはできません。C#では構造体が封印されているため、メンバーを紹介することは意味があります。(構造体が基本クラスから継承するメソッドが1つあります。)protectedprotected internalprotectedprotectedMemberwiseClone()

同様に、クラスは新しい(または)メンバーstaticを宣言できません。クラスは多くのメンバーとその一部を継承する場合がありますが、クラスに新しいメンバーを導入するようにコンパイラーに警告します。protectedprotected internalsealedprotectedoverrideprotectedsealed

于 2013-03-26T07:21:18.070 に答える