C# 类的受保护成员的OOP概念

C# 类的受保护成员的OOP概念,c#,C#,我正在使用C#恢复OOP概念,如受保护等。 问题是: // Demonstrate protected. using System; class B { protected int i, j; // private to B, but accessible by D public void Set(int a, int b) { i = a; j = b; } public void Show() {

我正在使用C#恢复OOP概念,如受保护等。 问题是:

// Demonstrate protected. 

using System;

class B
{
    protected int i, j; // private to B, but accessible by D 

    public void Set(int a, int b)
    {
        i = a;
        j = b;
    }

    public void Show()
    {
        Console.WriteLine(i + " " + j);
    }
}

class D : B
{
    int k; // private 

    // D can access B's i and j 
    public void Setk()
    {
        k = i * j;
    }

    public void Showk()
    {
        Console.WriteLine(k);
    }
}

class E : D 
{   //private
    int l;
    public void Setl() 
    {
        //using protected i,j
        l = i * j;
    }

    public void Showl()
    {
        Console.WriteLine(l);
    }
}

class ProtectedDemo
{
    static void Main()
    {
        D ob = new D();
        E e = new E();
        ob.Set(2, 3); // OK, known to D 
        ob.Show();    // OK, known to D 

        ob.Setk();  // OK, part of D 
        ob.Showk(); // OK, part of D

        e.Setl();
        e.Showl();
        Console.ReadKey();
    }
}

为什么e.Showl()显示“0”,那么它应该是6???

继承成员意味着派生类将拥有此成员,而不是它将与所有父级和子级共享其值(除非该成员是静态的)

At
ee=新的E()
初始化
E
新实例,该实例继承自
D
B
,但不会自动共享其他实例的字段值。如果这些字段
i
j
是静态的,他们将共享这些字段

执行此操作时:

E e = new E();
e.Set(21, 2);
e.Setl();
e.Showl();

响应将是
42

E
是一个与
ob
完全不同的实例,尽管
E
源于
D
它与
D
的另一个实例没有关系

如果希望
Show
的结果为6,则需要在
E
上调用
Set(2,3)

e.Set(2, 3);
e.Setl();
e.Showl();

您的代码真正需要什么:

D ob = new D(); // create D; i,j,k =0 (default value for int in c#)
E e = new E();  // create E; i,j,k,l =0
ob.Set(2, 3); // ob.i = 2, ob.j = 3 ; e.i and e.j still 0
ob.Show();    // 2 3

ob.Setk();  // ob.k=6 
ob.Showk(); // show 6
e.Setl();  //e.l = e.i* e.j  thus e.l=0*0=0
e.Showl(); //show 0
Console.ReadKey();
对象E的值存储在对象D的值以外的其他位置,即使它们具有相同的名称。如果希望D.i和E.i具有相同的值,请使用static关键字

其次,初始化变量,这在所有情况下都是一个很好的实践,尤其是不能预测整数的正确结果


Protected关键字表示子类可以通过调用的方式访问。这并不意味着子类对象具有相同的变量存储空间。

ob.Showl()如果需要6;)因为您忘记了
静态
和非
静态
之间的区别“与Public和private一样,protectedstatus与成员保持一致,无论涉及多少层继承。因此,当一个派生类用作另一个派生类的基类时,由第一个派生类继承的初始基类的任何受保护成员也会被第二个派生类继承为受保护的成员....@learningneverstopU plz会指定@OliverCharlesworth推荐阅读Rob Milles的免费书籍
C#Yellow book
。它提供了使用C#的访问修饰符、静态和基本OOP的精彩介绍:“inherit“可能不是这里最好的选择;
E
的一个实例确实继承了字段,它只是不共享它们。但是根据C#3.0,补全符引用:“与Public和private一样,protectedstatus与成员保持一致,无论涉及多少层继承。因此,当一个派生类用作另一个派生类的基类时,由第一个派生类继承的初始基类的任何受保护成员也将作为受第二个派生类保护的成员继承“是的,类
E
继承受保护的字段
i
j
,但由于这些字段不是
静态的
,因此
B
D
E
的每个实例都将为这些字段设置自己的值。