почему конечный результат равен нулю: пример OOPS - PullRequest
1 голос
/ 02 февраля 2011

У меня следующий код

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, и как я могу получить итоговый вывод как 15.1 без создания методаprintValue в производном классе.

Мне также нравится знать, как он отличается от языка к языку.Спасибо

1 Ответ

4 голосов
/ 02 февраля 2011

Переменная sum в Test1Class скрывает / скрывает переменную sum в TestClass. Поэтому, когда вы ссылаетесь на sum в Test1Class в методе Add, он ссылается на переменную Test1Class. Однако в последнем операторе печати в t.showValue() вы вызываете переменную суммы TestClass, которая еще никогда не изменялась. Это, следовательно, дает вам значение по умолчанию 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);
            }
        }
    }

Все, что я сделал, это удалил double sum; из Test1Class и изменил переменную суммы в TestClass на double, и вы должны получить результаты, которые вы ищете. (Использование защищенных переменных не очень рекомендуется, хотя ...)

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...