我正在使用 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
的新实例,它继承自 D
和 B
但不会自动共享其他实例的字段值。如果这些字段 i
和 j
是静态的,他们会共享这些。
当你这样做时:
E e = new E();
e.Set(21, 2);
e.Setl();
e.Showl();
响应将为 42
。
关于c# - 类的 protected 成员的 OOP 概念,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/26137981/