• c#继承与构造函数的调用


    1.实例化父类时,可以通过new子类来实例化父类,执行构造函数的顺序为:先执行父类的构造函数,再执行子类的构造函数。

    2.实例化子类时,只可以new子类,执行顺序同上。

    3.父类实例化后,只能执行父类的方法,获得父类的属性等。

    4.实例化子类,可同时执行子类和父类的方法和属性,如同名方法,则执行子类的方法。

    复制代码
    1 public class A
    2     {
    3         public A(string a) { }
    4     }
    5     public class B:A
    6     {
    7         public B() { }
    8     }
    复制代码

    这段代码会有一个错误提示:

    Severity Code Description Project File Line Suppression State
    Error CS7036 There is no argument given that corresponds to the required formal parameter 'a' of 'Program.A.A(string)' practise1 c:usersxuricdocumentsvisual studio 2015Projectspractise1practise1Program.cs 21 Active

    给A类添加无参数的构造函数即可解决。

    那么为什么会这样呢,我们知道,子类在创建对象执行构造函数之前会先执行父类的构造函数,那么假如父类中有多个构造函数,又是执行哪个呢,这时候base这个关键字我想可以来说明一切。还是看代码吧:

    复制代码
    public class A
        {
            public A() { }
            public A(string a) { }
        }
        public class B:A
        {
            public B():base()
            { }
        }
    复制代码

    在A中添加了无参构造函数,然后在B中修改了这句:pubic B():base(){},然后我们测试下,创建一个B对象,在A类中的2个构造函数中设置断点,发现无参构造函数执行了,我想正是因为这个base在这里发挥了作用,是base()指向了父类的无参构造函数。其实,在类B中,我们完全可以省略 base(),也能正常运行,

    第一段代码中提示的错误的原因是A类中没有无参的构造函数,这样在执行B中的构造函数的时候,就没法执行A中的无参构造函数了。 下面我在写一段不使用无参构造函数的代码,看了会更加清晰:

    复制代码
     public class A
        {
            public A(string a)
            {
                //
            }
        }
        public class B:A
        {
            public B(string a):base(a)
            {
                //
            }
        }
    复制代码

    B中的构造函数指定了调用父类的A(string a)构造函数。这样我们创建B对象在执行构造函数前就会执行父类中对应的指定的构造函数了。

  • 相关阅读:
    git打补丁、还原补丁
    mysql 查两个表相同的值
    系统更新后vs2012无法打开方案资源管理器
    Node.js之Buffer
    html元素固定
    在windows上用netsh动态配置端口转发
    Git忽略规则及.gitignore规则不生效的解决办法
    MySQL5.7.10 初始化失败error
    Nginx和PHP-FPM的启动、重启、停止脚本分享
    centos添加nginx为系统服务
  • 原文地址:https://www.cnblogs.com/Jeely/p/10950984.html
Copyright © 2020-2023  润新知