【问题标题】:why doesnt the support of "public" or "private" or "protected" Inheritance not give in c# [duplicate]为什么在c#中不支持“公共”或“私有”或“受保护”继承[重复]
【发布时间】:2013-03-15 20:32:30
【问题描述】:

我知道在 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 类的两个变量 (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 类的两个变量 (pub1, proc1) 被继承,但访问说明符与 A 类中的相同。

为什么在 .NET 框架中给出这种实现。这有什么好处和坏处?

【问题讨论】:

  • @AlokSave:谢谢,它有帮助
  • 其实prvt1字段也是继承的,但只能从A内部“看到”。例如,如果类A 包含处理B 实例的代码,它可以更改B 上的字段prvt1
  • 在非密封、非静态class 中,还有两个可能的可访问级别:internal int intnl1;protected internal int protintnl1;

标签: c# c++


【解决方案1】:

此答案仅与 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 成员。

【讨论】:

    【解决方案2】:

    也许这是一条评论,但它太大而无法放入评论区。

    我采用了你的类定义并尝试了这个 -

    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++ 不会将受保护的成员转换为公共的。还是我从问题中遗漏了什么?

    【讨论】:

    • C++ 确实将保护转换为公共,但如果继承方式是“受保护的”。但是,如果我们公开继承(如上面所做的那样)示例,则不会。
    • Privately Inherited:那么被继承类的访问说明符也是 private , 2. Protectedly Inherited :那么被继承类的访问说明符也是 protected , 3. Publicly Inherited :那么访问说明符继承的变量没有改变。
    • AFAIK 我认为 C# 不允许您访问控制继承。基类的访问修饰符是派生类型看到(或不看到)的。我对公开继承的 C++ 的受保护成员很好奇,看起来 A 的受保护成员仍然如此,即使基类是公开继承的?
    猜你喜欢
    • 2013-01-03
    • 1970-01-01
    • 1970-01-01
    • 2020-11-07
    • 2019-08-24
    • 1970-01-01
    • 1970-01-01
    • 2015-07-14
    • 2019-02-14
    相关资源
    最近更新 更多