2011-02-02 2 views
1

나는 다음 한 코드왜 최종 출력은 0이다 : OOPS 샘플

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.

나는 언어와 언어의 차이점을 알고 싶다. 감사

답변

4

Test1Class 그림자의 sum 변수는/TestClass에서 sum 변수를 숨 깁니다. 따라서 sumAdd 메서드에서 Test1Class으로 참조하면 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); 
      } 
     } 
    } 

은 내가 한 모든이 Test1Class에서 double sum;을 삭제하고 이중으로 TestClass에의 합 변수를 변경했다가, 당신은 당신이 찾고있는 결과를 얻을 수 있습니다. (보호 된 변수를 사용하는 것은 그렇게 권장하지 않습니다 ...)

+0

Testclass의 sum 변수도 Double이어야합니다. 그렇지 않으면 Test1class 메서드에서 "double을 int로 변환 할 수 없습니다"오류가 발생합니다. – Nanda

+0

@nanda - 사실, 다른 데이터 유형을 알지 못했습니다 ... 편집 ... – froadie

+0

감사합니다. 파생 클래스에서 기본 클래스 멤버의 데이터 유형을 구입할 수있는 방법이 있습니까? – Sharique