为什么不支持“公众”?或“;private"或“;protected"c#中没有继承

本文关键字:quot 继承 protected private 不支持 公众 为什么 | 更新日期: 2023-09-27 18:05:46

我知道在c++中,继承要么是"public"要么是"private"要么是"protected"这意味着如果我将类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类的两个变量(pub1, proc1)被继承,但是它们的访问说明符是public。但是在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类的两个变量(pub1, proc1)被继承了,但它们的访问说明符与A类中的相同。

为什么在。net框架中给出这种实现。这样做的利弊是什么?

为什么不支持“公众”?或“;private"或“;protected"c#中没有继承

也许这是一个评论,但它太大了,不适合在评论区

我把你的类定义和尝试这个-

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++没有把protected成员转换成public。还是我的问题遗漏了什么?

这个答案只是关于c#的。

在c#中,只有一种"级别"的继承,那就是一种"公共"继承。您的类A可以具有五种不同的可访问性成员,即:

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

publicprotected成员被继承时,它在派生类中仍然具有完全相同的可访问性。当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内部,不允许声明新的protected(或protected internal)成员,因为c#结构体是密封的,所以引入protected成员是有意义的。(有一个protected方法,MemberwiseClone(),结构从它们的基类继承。)

同样,static类不能声明新的protected(或protected internal)成员。sealed类可以继承许多protected成员,override也可以继承其中的一些成员,但是如果在sealed类中引入新的protected成员,则会给出编译器警告。