为什么不支持“公众”?或“;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框架中给出这种实现。这样做的利弊是什么?
也许这是一个评论,但它太大了,不适合在评论区
我把你的类定义和尝试这个-
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;
}
当public
或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
内部,不允许声明新的protected
(或protected internal
)成员,因为c#结构体是密封的,所以引入protected
成员是有意义的。(有一个protected
方法,MemberwiseClone()
,结构从它们的基类继承。)
static
类不能声明新的protected
(或protected internal
)成员。sealed
类可以继承许多protected
成员,override
也可以继承其中的一些成员,但是如果在sealed
类中引入新的protected
成员,则会给出编译器警告。