C# new 修饰符解析

   class ReadXMLConfig
    {
        //public abstract String operation(String rootpath, Setting gameconstants);



    }

    abstract class Setting
    {
        private static Setting setting;

        abstract public void initSetting(ReadXMLConfig r);
        public Setting(ReadXMLConfig r)
        {
            initSetting(r);
        }
    }

    class SettingMTW2 : Setting
    {

        public SettingMTW2(ReadXMLConfig r) : base (r)
        {
            initSetting(r);
        }

        public override void initSetting(ReadXMLConfig r)
        {
            Console.WriteLine("fu");
            //throw new NotImplementedException();

        }
     }

 class SettingMTW2BC : SettingMTW2
    {
        public SettingMTW2BC(ReadXMLConfig r) : base(r)
        {
            initSetting(r);
        }


        public new void initSetting(ReadXMLConfig r)
        {
            Console.WriteLine("zi");
            //throw new NotImplementedException();
        }
    }

 
 
    class Program
    {
        static void Main(string[] args)//主函数 
        {
            ReadXMLConfig r = new controller.ReadXMLConfig ();

            Setting s = new SettingMTW2BC(r);
        }
    } 

运行结果是

fu
fu
zi

为什么会这样子,
初始化动作进行多次只要最终是子类的就好。

看这篇文章我还以为打印出来就一个

fu

感谢。
有人详细说说new 的作用?
https://blog.csdn.net/jinsiku...

阅读 1.4k
1 个回答

这其中有两个点:

  1. 实例构造的时候会依次调用父类的构造函数
    所以调用 new SettingMTW2BC(r)的时候,其实是依次调用了new Setting(r),new SettingMTW2(r)new SettingMTW2BC(r),所以会输出三个
  2. 使用 Override 和 New 关键字进行版本控制,new 修饰符用于隐藏基类的方法,只有在最后调用到new SettingMTW2BC(r)的时候,才调用的是SettingMTW2BC.initSetting

如果想只输出一个,就不需要在后续的构造函数中调用initSetting。
如果只想输出最后子类的,就一路override 就可以了。

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进