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);
}
}
当我执行 aa.show()
时,我得到 5
(a
的值)作为输出,其中aa
是 A
的实例,但是当我执行 bb.show()
时,其中 bb
是B
,输出为 0
(a
的值)z
(b< 的值/代码>)。
有人可以解释为什么派生类无法显示 a 的当前值,即使它已被声明为受保护,但它能够显示 b
的正确值?
更新:
我会尝试建议的解决方案。关于编译错误,没有,我能够得到问题中提到的输出。
I am trying to execute the following code
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);
}
}
I am getting 5
(value of a
) as the output when I do aa.show()
where aa
is the instance of A
but when I do bb.show()
, where bb
is the instance of B
, the output comes out as 0
(value of a
) z
(value of b
).
Can someone please explain why the derived class is unable to display the current value of a even though it has been declared as protected whereas it is able to display the correct value of b
?
Update:
I'll try the solutions suggested. Regarding the compilation error, there was none and I was able to get the output as mentioned in the question.
如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。
绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论
评论(8)
请尝试以下操作:
Try the following:
如果您在 A 类的 Show() 方法之外设置 a 的值,您将得到您期望的结果。 B.Show 的实现隐藏了 A.Show,因此它永远不会执行。
If you set the value of a outside of the Show() method in class A, you will get the result that you expect. The implementation of B.Show hides A.Show, so it never executes.
您可能有这样的构建警告,不是吗?
正如 Paolo 提到的,B.Show 隐藏了 A.Show()。 Webleeuw 的代码展示了如何通过将 A.Show() 设为虚拟并使用 override 关键字标记 B.Show() 来执行您想要的操作。
PS 不要使用 ""+a 转换为字符串,使用 a.ToString()
You probably have a build warning like this, don't you?
As Paolo mentions, B.Show is hiding A.Show(). Webleeuw's code shows how to do what you want, by making A.Show() virtual and marking B.Show() with the override keyword.
P.S. Don't use ""+a to convert to string, use a.ToString()
bb.show()中a的当前值为0,因此输出是正确的。仅在 A 类的 Show 方法中将其设置为 5。
Current value of a in bb.show() is 0, so the output is correct. You set it to 5 only in the Show method in the A class.
您必须在类构造函数或其他方法中初始化
a
的值。B
类中声明的Show()
隐藏了A
类中声明的Show()
,因此的方法未调用
类。阅读有关 C++ 和 C# 中的多态性和继承的更多信息。
例如,您可能会对这段代码的结果感到惊讶:
;-)
Your must initialize value of
a
in class constructor or other method.Show()
declared inB
class hidesShow()
declared inA
class, therefore method ofA
class not invoked.Read more about polymorphism and inheritance in C++ and C#.
E.g. you can be surprised with results of such piece of code:
;-)
a=5;在您的 A.Show 方法中设置。
B 类永远不会设置 a=5,因为它将使用 B.Show 方法。
这个问题不太正确:为什么派生类无法显示 a 的当前值?
派生类能够显示a 值,但是这个a 值从未改变B 类中的默认值0。
还尝试初始化 Show() 的外部,例如:
a=5; is set in your A.Show method.
B class will never set a=5 because it will use the B.Show method.
The question is not quite correct: why the derived class is unable to display the current value of a?
The derived class is able to display the a value, but this a value never changed from default 0 in the B class.
try also to initialize a outside of Show() like:
使用模板方法模式 http://en.wikipedia.org/wiki/Template_method_pattern
Use a Template Method pattern http://en.wikipedia.org/wiki/Template_method_pattern
您的 B 方法隐藏了 A 方法,您应该收到有关此的编译器警告。
更好的是如下 - 请注意 virtual 和 override 关键字:
但是在这里您将弹出两个消息框。您需要将 A 中变量的设置与消息框函数分开,例如在构造函数中设置 'a'。
Your B method is hiding the A method, you should be getting a compiler warning about this.
Better is as follows - note the virtual and override keywords:
But here you'll have two message boxes pop up. You need to separate the setting of the variable in A with the message box function, for example set 'a' in the constructor.