繁体   English   中英

受保护类的OOP概念

[英]OOP concept of protected members of a class

我正在使用C#恢复OOP概念,例如protected等。 这是问题所在:

// 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 ???

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

E e = new E(); 初始化E新实例 ,它继承自DB但不自动共享其他实例的字段值。 如果这些字段ij是静态的,他们将共享这些字段。

当你这样做:

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

响应将是42

E是与ob完全不同的实例,尽管ED派生的,它与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的值之外的其他位置,即使它们具有相同的名称。 如果希望Di和Ei具有相同的值,请使用static关键字。

其次,初始化变量,这在所有情况下都是一个好习惯,尤其是你无法预测整数的正确结果。

受保护的关键字意味着以调用方式访问子类。 这并不意味着子类对象具有相同的变量存储。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM