为什么最终输出为零:OOPS样本

时间:2011-02-02 13:00:12

标签: c# inheritance oop

我有以下代码

using System;

namespace xyzApp
{
    class Program
    {
        public static void Main(string[] args)
        {               
            Test1Class t = new Test1Class ();
            t.Add(4);
            t.Add(11.1);
            t.showValue();
            Console.Write("Press any key to continue . . . ");
            Console.ReadKey(true);
        }
    }


    class TestClass{
        protected  int sum =0;

        public void Add(int x)
        {
            sum+=x;
        }

        public void showValue()
        {
            Console.WriteLine(" the sum is : {0}",sum);
        }
    }

    class Test1Class :TestClass
    {
        double sum ;

        public void Add(double x)
        {
            sum+=x;
            Console.WriteLine(" the sum is : {0}",sum);
        }
    }
}

输出

 the sum is : 4
 the sum is : 15.1
 the sum is : 0
Press any key to continue . . .

有人可以解释一下,为什么最终输出为0,以及如何在派生类中不创建方法printValue的情况下将最终输出设为15.1。

我也想知道它与语言有何不同。 感谢

1 个答案:

答案 0 :(得分:4)

sum阴影中的Test1Class变量隐藏/隐藏sum中的TestClass变量。因此,当您在sum方法中引用Test1Class中的Add时,它会引用Test1Class的变量。但是,在t.showValue()的最终打印语句中,您正在调用TestClass的sum变量,该变量从未被更改过。因此,这将为您提供默认值0。

你可能想要做的是完全摆脱Test1Class的成员变量并使用TestClass,因为你无论如何都要将它设置为受保护,因此所有派生类都可以使用它。

你可能想要这样的东西:

  using System;

    namespace xyzApp
    {
        class Program
        {
            public static void Main(string[] args)
            {               
                Test1Class t = new Test1Class ();
                t.Add(4);
                t.Add(11.1);
                t.showValue();
                Console.Write("Press any key to continue . . . ");
                Console.ReadKey(true);
            }
        }


        class TestClass{
            protected  double sum =0;

            public void Add(int x)
            {
                sum+=x;
            }

            public void showValue()
            {
                Console.WriteLine(" the sum is : {0}",sum);
            }
        }

        class Test1Class :TestClass
        {                   
            public void Add(double x)
            {
                sum+=x;
                Console.WriteLine(" the sum is : {0}",sum);
            }
        }
    }

我所做的只是从Test1Class中删除double sum;并将TestClass中的sum变量更改为double,您应该得到您正在寻找的结果。 (使用受保护的变量并不是那么强烈推荐,但是......)