【问题标题】:derived class cannot display value of base class variables in C#派生类无法在 C# 中显示基类变量的值
【发布时间】:2010-01-07 15:03:52
【问题描述】:

我正在尝试执行以下代码

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() 时,我得到5a 的值)作为输出,其中aaA 的实例,但是当我执行bb.show() 时,bbB 的实例,输出为 0a 的值)zb 的值)。

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

更新:

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

【问题讨论】:

  • 你想要一个 be == 5 还是不?这个问题不太正确:为什么派生类不能显示a的当前值?派生类能够显示a值,但是这个a值永远不会改变从B类中的默认0。

标签: c# inheritance variables base-class


【解决方案1】:

你的 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'。

【讨论】:

  • 不懂的人问问题连代码都不编译...告诉得到输出...
【解决方案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); 
     } 
} 

【讨论】:

    【解决方案3】:

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

    【讨论】:

      【解决方案4】:

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

      警告 1 'ConsoleApplication7.B.Show()' 隐藏继承的成员 'ConsoleApplication7.A.Show()'。采用 如果隐藏的新关键字是 故意的。 C:\文档和 设置\jhoover.ANDT\我的 文档\Visual Studio 2005\Projects\ConsoleApplication7\ConsoleApplication7\Program.cs 25 21 ConsoleApplication7

      正如 Paolo 所提到的,B.Show 隐藏了 A.Show()。 Webleeuw 的代码通过将 A.Show() 设为虚拟并使用 override 关键字标记 B.Show() 来展示如何做您想做的事情。

      附:不要用""+a转成字符串,用a.ToString()

      【讨论】:

        【解决方案5】:

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

        【讨论】:

          【解决方案6】:

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

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

          例如你会对这样一段代码的结果感到惊讶:

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

          ;-)

          【讨论】:

            【解决方案7】:

            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
            

            【讨论】:

              【解决方案8】:

              使用模板方法模式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;
               }
              }
              

              【讨论】:

                猜你喜欢
                • 2018-05-19
                • 2018-01-20
                • 1970-01-01
                • 2011-07-14
                • 2014-10-17
                • 2014-03-13
                • 1970-01-01
                • 2011-02-10
                • 1970-01-01
                相关资源
                最近更新 更多