我有以下代码
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。
我也想知道它与语言有何不同。 感谢
答案 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,您应该得到您正在寻找的结果。 (使用受保护的变量并不是那么强烈推荐,但是......)