繁体   English   中英

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

[英]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 (的值az (的值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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM