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