c# - 类的 protected 成员的 OOP 概念

标签 c#

我正在使用 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

关于c# - 类的 protected 成员的 OOP 概念,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/26137981/

相关文章:

c# - 如何使我的自定义 TaskScheduler 成为默认任务调度程序

c# - 并发请求预防

c# - 使用 .resx 文件本地化 Prism 4 模块

c# - 空值的处理

c# - 针对 .NET Core 与 .NET Standard

c# - 层次结构不会在 View 中更新

c# - 在 Visual Studio 中组合多个配置文件

c# - 应用程序洞察 : Define an email alert for every reported crash

c# - 当前在 C# 中跟踪程序流的可能性?

带有数组的 C# 结构