首页 > 其他分享 >构造函数的继承和派生类选择基类的构造方法

构造函数的继承和派生类选择基类的构造方法

时间:2022-12-21 15:46:44浏览次数:51  
标签:初始化 Console 构造方法 Manager 基类 构造函数 public Staff

对于构造方法的继承需要注意2点:

  1. 初始化一个对象时,基类base class的构造方法总是会首先执行
  2. 基类base class的有参构造方法不会被继承,在派生类中需要我们重新定义新的构造方法

实验1

比如说现在有一个Staff类(员工类),有一个默认的构造方法,这个默认方法只输出一个语句。
然后再创建一个Manager类(经理类),继承Staff类(员工类),而Manager类(经理类)继承自Staff类,在csharp中,类的继承需使用冒号连接基类的名称。同样地,Manager类也创建一个默认的构造方法,只输出一个语句。

public class Staff
{
    public Staff()
    {
        Console.WriteLine("员工类初始化");
    }
}

public class Manager : Staff
{
    public Manager()
    {
        Console.WriteLine("经理类初始化");
    }
}

然后在main方法中实例化Manager类,然后运行代码

        static void Main(string[] args)
        {
            Manager manager = new Manager();
            Console.Read();
        }

这时候将打印出

输出结果表明,当我们在创建Manager对象的时候,作为派生类,它不仅了调用自己的构建方法,还会在调用自己的构造方法之前先调用基类,也就是Staff类的构造方法。所以,从对象初始化的角度上来说,我们都会首先调用基类的构造方法、然后再一层一层调用派生类的构造方法。

实验2

接下来,为Staff类添加一个公有属性:员工编号。同时呢,我们初始化Staff类时除了有默认的构造方法外,还有一个带参数的构造方法:

        public class Staff
        {
            public Staff()
            {
                Console.WriteLine("员工类初始化");
            }
            public int Number { get; set; }
            public Staff(int number)
            {
                Number = number;
            }
        }

然后在Manager类中也添加一个带参数的构造方法:

        public class Manager : Staff
        {
            public Manager()
            {
                Console.WriteLine("经理类初始化");
            }
            public Manager(int number)
            {
                Console.WriteLine($"{number} - 经理类初始化");
            }
        }

完整的代码如下:

    class Program
    {
        public class Staff
        {
            public Staff()
            {
                Console.WriteLine("员工类初始化");
            }
            public int Number { get; set; }
            public Staff(int number)
            {
                Number = number;
            }
        }
        public class Manager : Staff
        {
            public Manager()
            {
                Console.WriteLine("经理类初始化");
            }
            public Manager(int number)
            {
                Console.WriteLine($"{number} - 经理类初始化");
            }
        }
        static void Main(string[] args)
        {
            Manager manager = new Manager(800);
            Console.WriteLine(manager.Number);//输出0
            Console.Read();
        }
    }

这时候打印出

为什么manager对象的编号是0呢?一般来说整数对象没有赋值的时候才会是0,所以这就说明构造方法根本没有对Manager类的员工编号赋值。
输入的第一行是实际是从Staff类的默认午餐构造方法中产生的。这就说明,虽然我们在初始化Manager对象的时候使用了参数,但是在调用继承构造方法的时候,并不是按我们预想的那样调用Staff类有参数的构造方法,而是调用了无参数的默认构造方法。

实际上,如果一个类存在多个构造方法,那么在派生类处理继承的时候就面临着多个构造方法选择的问题。在默认情况下,无论基类有多少个构造方法,他的派生类在创建对象的时候都会默认使用默认无参数构造方法执行继承工作。所以,这就是为什么manager对象的赋值会失败。

对于基类拥有多个构造方法的时候,派生类如何选择才能在继承过程中顺利处理我们需要的初始化方法呢?这个时候我们就需要使用base关键词了。

base解释:
base就是基础、代表的就是基类

  1. 使用 base 关键字可以从派生类中访问基类的成员:
  2. 指定创建派生类实例时应调用的基类构造函数。
  3. 仅允许基类访问在构造函数、实例方法或实例属性访问器中进行。
  4. 注意:静态方法中不能使用 base 关键字。

将代码调整一下,再运行,manager对象的编号就为800了

    class Program
    {
        public class Staff
        {
            public Staff()
            {
                Console.WriteLine("员工类初始化");
            }
            public int Number { get; set; }
            public Staff(int number)
            {
                Number = number;
            }
        }
        public class Manager : Staff
        {
            public Manager()
            {
                Console.WriteLine("经理类初始化");
            }
            public Manager(int number) : base(number)
            {
                Console.WriteLine($"{number} - 经理类初始化");
            }
        }
        static void Main(string[] args)
        {
            Manager manager = new Manager(800);
            Console.WriteLine(manager.Number);//输出0
            Console.Read();
        }
    }

以上

标签:初始化,Console,构造方法,Manager,基类,构造函数,public,Staff
From: https://www.cnblogs.com/ynysj/p/16995333.html

相关文章

  • C# 类的构造函数以及析构函数
    类的构造函数以及析构函数构造函数在类初始化的时候被调用,可以方便提前传参。usingSystem;namespaceMyNameSpace{classDemo{privatedoubleleng......
  • python调go dll库构造函数方法
    调用方法最主要的是 fromctypesimport* 里面包含了windll调用加载方法,具体用windll还是cdll加载动态库见百度接下来就是classGoString(Structure):_fields_=[(......
  • Java 中匿名内部类的构造方法
    因为匿名内部类没有名字这个特殊性质,所以我们无从给它指定构造方法,构造方法必须和类名同名,类名都没有,构造方法就无从谈起了。但是匿名内部类可以通过直接调用父类的构造方......
  • Java继承构造方法的注意点
    父类:注意(x,y是private,不能继承到子类中)classPar{privateintx;privateinty;inta;publicPar(){}publicPar(intx,inty){t......
  • JAVA中子类继承时构造方法注意事项
    JAVA中子类继承时构造方法注意事项类的继承不容易理解的一种情况:父类只存在有参构造,子类的构造方法必需要做相应的处理,比如说也创建有参构造,为什么?1、任何类,如果无显......
  • c++中的构造函数,拷贝构造函数和赋值函数
    1、拷贝构造和赋值函数的区别:1)拷贝构造函数是一个对象初始化一块内存区域,这块内存就是新对象的内存区,而赋值函数是对于一个已经被初始化的对象来进行赋值操作。2)一般来说......
  • Effective Java-2. 当构造方法参数过多时使用builder模式
    背景静态工厂和构造方法不能很好的拓展到很多可选参数的场景,因为参数过多的时候,调用其构造方法不太能知道每个位置参数的含义,容易出bug那么为这个类编写什么样下的构造方......
  • Effective Java-1.考虑使用静态工厂方法代替构造方法
    静态工厂方法的优点不像构造方法,静态工厂是有名字的精心构造的名称使得静态工厂方法更容易使用和理解,即知道创建的是什么对象与构造方法不同,不用每次都创建一个新的......
  • Appium自动化框架从0到1之 基类的封装
    这里只封装了4个基类,其他的大家可以自己丰富~~直接上代码:baseView.py#-*-coding:utf-8-*-"""@auth:carl_DJ@time:2020-7-9"""classBaseView(object):'''......
  • [自用初学]c++的构造函数
    #include<stdio.h>#include<string.h>classStudent{private:intid;charname[32];public:Student(intid,constchar*name){......