类文件:using System;
using System.Collections.Generic;
using System.Text;namespace testoo
{
    public class student
    {
        public string name;
        public string sex;
        public yuanxi myyuanxi;
    }    public abstract class yuanxi
    {
        public string name;
        public string baodao(student sd)
        {
            return sd.name + ",来"+name+"这里报道了!";
        }
        public virtual string jiaoqian(student sd)
        {
            return sd.name + "去" + caiwu.name + "交钱";
        }
    }    public class caiwu
    {
        public static string name = "财务室";
    }    public class wuli : yuanxi
    {
        public new string name = "物理系";
    }    public class hangkong : yuanxi
    {
        public new  string name = "航空系";
        public override string jiaoqian(student sd)
        {
            return sd.name + "去" + name + "交钱";
        }
    }
}
winform内容:        private void Form1_Load(object sender, EventArgs e)
        {
            testoo.student me = new student();
            me.name = "张学友";
            me.myyuanxi = new testoo.hangkong();
            MessageBox.Show(me.myyuanxi.jiaoqian(me));
            MessageBox.Show(me.myyuanxi.baodao(me));
        }
说明 jiaoqian 交钱这个方法,是虚方法,可以被不同的院系覆写
但是 baodao  报道 这个方法对于所以院系来说都是一样的。只是具体的院系的名字不同.所以没有定为可覆写.
现在因为 抽象类 public abstract class yuanxi 是没有名字的。他的名字是在具体的院系中定义的。
现在抽象类 yuanxi的 baodao 这个方法中的name不会被继承它的类的name覆写.大家运行一下就知道了。
报道这个方法 显示的内容是 "张学友来这里报名了" 没有院系的名字。
现在我想怎么不改动 抽象类的 baodao这个方法(不改为虚函数,不想让他覆写,因为方法都一样。只是一个内部成员变量不一样) 来实现我想要的效果呢?

解决方案 »

  1.   

    因为你的基类是抽象类,因此你的基类的name没有时间初始化,所以一直是null,抽象类一般都是定义一些抽象的行为,具体的数据应该在派生类来定义。
      

  2.   


    注意一下new 关键字的用法,这样用不对,new 是用来解决版本了冲突的
    把hangkong 类改成如下:
        public class hangkong : yuanxi
        {
            //public new string name = "航空系";
            public hangkong()
            {
                name = "航空系";
            }
            public override string jiaoqian(student sd)
            {
                return sd.name + "去" + name + "交钱";
            }
        }