派生类无法在C#中显示基类变量的值

时间:2010-01-07 15:03:52

标签: c# inheritance variables base-class

我正在尝试执行以下代码

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 aaa.show()的实例时,我得到aa(值A)作为输出,但是当我做bb.show()bb,其中B0的实例,输出结果为a(值为zb(值为{ {1}})。

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

更新

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

8 个答案:

答案 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;
 }
}