0

我正在尝试执行以下代码

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);
    }
}

当我执行 where is of 实例时,我得到5(value of a) 作为输出,但是当我执行aa.show()where is of 实例时,输出结果为(value of ) (value of )。aaAbb.show()bbB0azb

有人可以解释为什么派生类无法显示 a 的当前值,即使它已被声明为受保护,而它能够显示正确的值b

更新:

我会尝试建议的解决方案。关于编译错误,没有,我能够得到问题中提到的输出。

4

8 回答 8

9

您的 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”。

于 2010-01-07T15:04:51.437 回答
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); 
     } 
} 
于 2010-01-07T15:07:50.620 回答
1

如果您在 A 类中的 Show() 方法之外设置 a 的值,您将获得预期的结果。B.Show 的实现隐藏了 A.Show,因此它永远不会执行。

于 2010-01-07T15:07:14.037 回答
1

你可能有这样的构建警告,不是吗?

警告 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()

于 2010-01-07T15:12:19.877 回答
0

bb.show() 中 a 的当前值为 0,因此输出正确。您仅在 A 类的 Show 方法中将其设置为 5。

于 2010-01-07T15:08:41.617 回答
0

a您必须在类构造函数或其他方法中初始化值。
Show()在类中声明B隐藏Show()A类中声明,因此A未调用类的方法。

阅读有关 C++ 和 C# 中的多态性和继承的更多信息。

例如,您可能会对这样一段代码的结果感到惊讶:

A aa;
B bb;
//... init vars ...
aa = bb;
bb.Show();
aa.Show();
bb.Show();

;-)

于 2010-01-07T15:09:02.520 回答
0

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
于 2010-01-07T15:10:23.390 回答
-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;
 }
}
于 2010-01-07T15:20:06.320 回答