C#类继承和一个简单示例
我发现自己就是一个例子,我被卡住了。我知道它会打印出来:C#类继承和一个简单示例,c#,class,C#,Class,我发现自己就是一个例子,我被卡住了。我知道它会打印出来: public class A { public static int a = 12; public virtual int g() { a--; return h(); } public virtual int h() { a--; return i(); } public int i() { return --a; } } class B : A { public int b = 12;
public class A {
public static int a = 12;
public virtual int g() { a--; return h(); }
public virtual int h() { a--; return i(); }
public int i() { return --a; }
}
class B : A {
public int b = 12;
public override int h() { b++; return (a--) + (b++); }
public new int i() { return this.g(); }
static void Main(string[] args) {
Console.WriteLine("A: {0} {1} {2}", new A().g(), new A().h(), new A().i());
Console.WriteLine("B: {0} {1} {2}", new B().g(), new B().h(), new B().i());
Console.ReadLine();
}
}
但我不知道它为什么会打印:
A: 9 7 6
在A
车道上,它g()
取12,使其成为11,然后将其推到h()
-然后是10,i()
使其成为9,甚至在它去任何其他地方之前。所以肯定是A
:9。然后又是一样的,所以是9 7和6。
但是在B
:它采用现有的a(现在是6),而g()
使其成为5。然后b
增加到13,然后5+13=18。之后它将a=5
更改为a=4
,并b=14
。我明白。但为什么下一次又是17?它不应该是18吗?调用B().g()
正在创建一个新的B
变量,将其值设置为12
,因为您正在创建一个新的B
对象。在
h()
return(a-)+(b++)
返回17,因为a
和b
的值分别为4和13。主要区别在于类别a
的成员a
是静态的,这意味着类A
的每个实例共享相同的值,而类B
使用实例变量B
,对于每个新实例,该变量重置为默认值(12)。首先,让我们开始逐步读取源代码。让我们先看看A班
- 它有一个名为
a
的静态整数变量,该变量保存值12
- 有三个函数
g()、h()
和i()
- 函数
g()
将a
减少1,并调用h()
现在a
的值为11
- 函数
h()
将a
减少1,并调用i()
现在a
的值为10
- 函数
i()
将a
减少1并返回a
现在返回的a
值为9
现在让我们解剖B类
- 它从A类扩展而来
- 它有一个名为
b
的public(非静态)
整数变量,该变量保存值为12
好的,你已经发现了一个区别,一个是静态的,另一个不是。这意味着所有A
对象从扣除的值继续,并且所有B
对象在每次对象创建时使用重置值一次。这就是您遇到的错误。调试程序。逐行检查,看看每个变量是如何影响给定变量的。这将使大多数操作变得清晰。请不要编写像这样的真实代码。这是OO意大利面条。字段和方法名的a b g h等并没有真正起到帮助…将问题分解为您理解的部分和您不理解的部分。一旦你到了那里,你可以只研究你不理解的部分,如果你没有找到答案,那么试着只发布那部分。事实上,由于所有的单变量练习都是胡说八道,解决这个问题毫无意义。+1有趣的谜题,尽管如此,我不愿意用这个逻辑之王来编写程序。谢谢你,先生。这样的错误,它肯定不是静态的。它没有将b
设置为12,而是创建了一个全新的b
变量;旧的仍然存在,并且具有旧的值。这是一个非常重要的区别。
B: 18 17 15