我正在尝试执行以下代码
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
(值为{ {1}})。
有人可以解释为什么派生类无法显示a的当前值,即使它已被声明为受保护但是它能够显示b
的正确值吗?
更新
我会尝试建议的解决方案。关于编译错误,没有,我能够得到问题中提到的输出。
答案 0 :(得分:9)
您的B方法隐藏了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()
{
base.Show();
b='z';
MessageBox.Show(""+a+ ""+b);
}
}
但是在这里你会弹出两个消息框。您需要将A中变量的设置与消息框功能分开,例如在构造函数中设置'a'。
答案 1 :(得分:2)
尝试以下方法:
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);
}
}
答案 2 :(得分:1)
如果在A类中设置Show()方法的外部值,您将得到预期的结果。 B.Show的实现隐藏了A.Show,因此它永远不会执行。
答案 3 :(得分:1)
你可能有这样的构建警告,不是吗?
警告1'ConsoleApplication7.B.Show()' 隐藏继承的成员 'ConsoleApplication7.A.Show()'。使用 隐藏的新关键字是 意。 C:\ Documents and 设置\ jhoover.ANDT \我的 Documents \ Visual Studio 2005 \ Projects \ ConsoleApplication7 \ ConsoleApplication7 \ Program.cs 25 21 ConsoleApplication7
正如Paolo所提到的,B.Show正在隐藏A.Show()。 Webleeuw的代码显示了如何做你想要的,通过使A.Show()虚拟并用override关键字标记B.Show()。
P.S。不要使用“”+ a转换为字符串,请使用a.ToString()
答案 4 :(得分:0)
bb.show()中a的当前值为0,因此输出正确。您只能在A类的Show方法中将其设置为5。
答案 5 :(得分:0)
您必须在类构造函数或其他方法中初始化a
的值
在Show()
类中声明的B
隐藏Show()
类中声明的A
,因此A
类的方法未被调用。
在C ++和C#中阅读有关多态和继承的更多信息。
E.g。你会对这段代码的结果感到惊讶:
A aa;
B bb;
//... init vars ...
aa = bb;
bb.Show();
aa.Show();
bb.Show();
- )
答案 6 :(得分:0)
A = 5;在A.Show方法中设置。
B类永远不会设置= 5,因为它将使用B.Show方法。
问题不太正确:为什么派生类无法显示的当前值?
派生类能够显示一个值,但一个值从未改变从B类中的默认值0开始。
还尝试初始化Show()外部,如:
class A {
protected int a = 5; // a = 5 will be visible in B too
答案 7 :(得分:-2)
使用模板方法模式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;
}
}