2013-06-26 86 views
4
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(); 
    } 
} 

我发现自己的例子,我卡住了。我知道这会打印:C#类继承和一个简单的例子

A: 9 7 6 

,但我不知道为什么它打印:

B: 18 17 15 

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 = 4b = 14。我明白了。但为什么在下一次呢?难道不是18岁?

+5

调试程序。逐行查看它们是如何影响给定变量的。这应该使大部分操作清楚。 – Servy

+6

请不要写这样的真实代码。这是OO意大利面条。 –

+1

以及字段和方法名称等不是真的有帮助... – gsharp

回答

4

的主要差别是在class Amember a的情况下是static,这意味着class A的每个实例共享相同的值,而class B使用实例变量b,该实例变量复位为每个新实例的默认值(12)。

+1

谢谢先生。这样的错误,它肯定不是静止的。 – Tomasz

1

调用B().g()正在创建一个新的b变量,将其值设置为12,因为您正在创建一个新的B对象。

h()内,b++是其值设置为13,并且
return (a--) + (b++)正在返回17,由于ab值是4和13

+1

它不*设置* b到12,*它创建一个全新的'b'变量*;旧的仍然存在并具有旧的价值。这是一个非常重要的区别。 – Servy

+0

你说得对,我已经改变了。谢谢 – Liel

0

首先让我们开始逐步阅读源代码。我们先看看A级。

  • 它具有称为a保持值12
  • 静态整数变量有三种功能g(), h()i()
  • 功能g()减一a并调用h()现在的a的值为11
  • 功能h()减少a 1,并致电i()现在值a是10.
  • 功能i()减一a并返回a现在它返回的a值为9

现在让我们来剖析这个类B.

  • 它从类A延伸。
  • 它有一个public (non static)整型变量,名为b,其值为12。

好吧,你已经发现一个是静态的,另一个不是。这意味着所有A对象都从扣除值继续,并且所有B对象在每个对象创建时都使用重置值。这是你的错误。