类中受保护成员的OOP概念
本文关键字:OOP 概念 成员 受保护 | 更新日期: 2023-09-27 18:25:15
我正在使用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???
继承成员意味着派生类将拥有此成员,而不是与所有父代和子代共享其值(除非该成员是静态的)。
在E e = new 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关键字。
其次,初始化变量,这在任何情况下都是一个很好的做法,尤其是你无法预测整数的正确结果。
受保护的关键字意味着子类可以通过调用的方式访问。这并不意味着子类对象具有相同的变量存储。