[英]derived class cannot display value of base class variables in C#
我正在尝试执行以下代码
class A
{
protected int a;
protected char b;
public void Show()
{
a=5;
MessageBox.Show(""+a);
}
}
class B:A
{
public void Show()
{
b='z';
MessageBox.Show(""+a+ ""+b);
}
}
我得到5
(价值a
)作为输出,当我做aa.show()
其中aa
是实例A
,但是当我做bb.show()
其中bb
是实例B
,输出出来的0
(的值a
) z
(的值b
)。
可有人请解释为什么派生类是无法显示的当前值,即使它已被宣布为受保护的,而它是能够显示的正确值b
?
更新:
我将尝试建议的解决方案。 关于编译错误,没有任何错误,我能够获得问题中提到的输出。
您的B方法隐藏了A方法,您应该收到关于此的编译器警告。
更好的方法如下-注意virtual和override关键字:
class A
{
protected int a;
protected char b;
public virtual void Show()
{
a=5;
MessageBox.Show(""+a);
}
}
class B:A
{
public override void Show()
{
base.Show();
b='z';
MessageBox.Show(""+a+ ""+b);
}
}
但是,这里您将弹出两个消息框。 您需要使用消息框功能分隔A中变量的设置,例如在构造函数中设置“ a”。
请尝试以下操作:
class A
{
protected int a;
protected char b;
public virtual void Show()
{
a=5;
MessageBox.Show(""+a);
}
}
class B:A
{
public override void Show()
{
b='z';
MessageBox.Show(""+a+ ""+b);
}
}
如果您在类A中的Show()方法外部设置值,则将获得期望的结果。 B.Show的实现隐藏了A.Show,因此它永远不会执行。
您可能会有这样的构建警告,不是吗?
警告1'ConsoleApplication7.B.Show()'隐藏继承的成员'ConsoleApplication7.A.Show()'。 如果要隐藏,请使用new关键字。 C:\\ Documents and Settings \\ jhoover.ANDT \\ My Documents \\ Visual Studio 2005 \\ Projects \\ ConsoleApplication7 \\ ConsoleApplication7 \\ Program.cs 25 21 ConsoleApplication7
如Paolo所述,B.Show隐藏了A.Show()。 Webleeuw的代码显示了如何通过将A.Show()虚拟化并使用override关键字标记B.Show()来完成所需的工作。
PS不要使用“” + a转换为字符串,请使用a.ToString()
bb.show()中a的当前值为0,因此输出正确。 您只能在A类的Show方法中将其设置为5。
你必须初始化的值a
类构造函数或其他方法。
B
类中声明的Show()
隐藏A
类中声明的Show()
,因此不会调用A
类的方法。
阅读有关C ++和C#中的多态性和继承的更多信息。
例如,您可能会对以下代码段的结果感到惊讶:
A aa;
B bb;
//... init vars ...
aa = bb;
bb.Show();
aa.Show();
bb.Show();
;-)
a = 5; 在您的A.Show方法中设置。
B类将永远不会设置a = 5,因为它将使用B.Show方法。
这个问题不是很正确: 为什么派生类无法显示a的当前值 ?
派生类能够显示a值,但此a值从B类的默认0到现在都没有改变 。
还尝试初始化Show()的外部,例如:
class A {
protected int a = 5; // a = 5 will be visible in B too
使用模板方法模式http://en.wikipedia.org/wiki/Template_method_pattern
class A
{
protected int a;
protected virtual string GetForShow()
{
a = 5;
return a.ToString();
}
public void Show()
{
var forShow = GetForShow();
MessageBox.Show(forShow);
}
}
class B
{
protected char b;
protected override string GetForShow()
{
b = 'z';
return base.GetForShow() + b;
}
}
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.