一点一点学架构(二)——继承中的构造函数调用

前言

  在Java基础中我们学“继承中的构造方法”时,强调了以下几点:

  • 子类构造过程必须调用其基类的构造过程。
  • 可以通过显示调用或系统默认的方式调用基类的构造过程。
  • 显示调用:通过Super(参数)来调用,且必须放在子类构造方法的第一行。
  • 系统默认调用:调用基类的无参构造函数。

  回顾.NET,道理也是一样的。

  本文,首先以一个Demo给大家解释一下该知识点,然后再结合项目说一下该知识点的具体应用。

示例

    public class GrandFather
    {
        public GrandFather()
        {
            Console.WriteLine("GrandFather:默认构造函数");
        }
        public GrandFather(int a, int b)
        {
            Console.WriteLine("GrandFather带参构造:a={0}, b={1}.", a, b);
        }
    }

    public class Father : GrandFather
    {
        public Father()
        {
            Console.WriteLine("Father:默认构造函数");
        }
        public Father(int a, int b)
        {
            Console.WriteLine("Father带参构造:a={0}, b={1}.", a, b);
        }
    }

    public class Child : Father
    {
        public Child()
        {
            Console.WriteLine("Child:默认构造函数");
        }
        public Child(int a, int b)
        {
            Console.WriteLine("Child带参构造:a={0}, b={1}.", a, b);
        }
    }

    class Program
    {
        static void Main(string[] args)
        {
            Child mychild = new Child(1,2);
        }
    }

  程序在实例化Child这个子类时,会先调用最上层父类的构造函数,再调用父类的构造函数,然后再调用自己的构造函数,执行结果如下图所示:

   

项目中应用

BLL层

        

  当我们实例化B层的一个具体业务类时如:

  new UserInfoBLL()时,程序执行过程:

  

  这时,首先调用最上层父类的构造方法CoreBaseService(),在这个构造方法里调用了另外两个方法:SetDbSession(),SetCurrentDal()。

        /// <summary>
        /// 构造函数初始化
        /// </summary>
        public CoreBaseService()
        {
            SetDbSession();
            SetCurrentDal();
        }

        //子类必须实现此方法来确定具体的DbSession对象
        public abstract void SetDbSession();

        //子类必须实现此方法,设置当前具体的Dal
        public abstract void SetCurrentDal();

  这两个方法在CoreBaseService中没有实现,所以会去它的子类中寻找实现。所以紧接着在BaseService中找到了SetDbSession的实现,然后在UserInfoBLL中找到了SetCurrentDal的实现。

  然后,调用父类BaseService的构造函数。

  最后,调用自身构造函数UserInfoBLL(),获得实例。

DAL层

        

        

  在CoreBaseDal的构造方法中调用了SetDbContext这个抽象方法。

总结

  通过继承中的构造函数这一知识点,明白了项目架构图中在纵向角度各个类之间的关系。

版权声明:本文为博主原创文章,未经博主允许不得转载。

时间: 2024-08-26 01:19:40

一点一点学架构(二)——继承中的构造函数调用的相关文章

Swift难点-继承中的构造规则实例具体解释

关于继承中的构造规则是一个难点. 假设有问题,请留言问我. 我的Swift新手教程专栏 http://blog.csdn.net/column/details/swfitexperience.html 为什么要有构造器:为类中自身和继承来的存储属性赋初值. 一.两种构造器-指定构造器和便利构造器 指定构造器:类中必备的构造器.为全部的属性赋初值.(有些子类可能不须要显示声明,由于默认从基类继承了) 便利构造器:类中的辅助构造器,通过调用指定构造器为属性赋初值.(仅在必要的时候声明) 举例 cla

C++--继承中的构造与析构、父子间的冲突

一.继承中的构造与析构 Q:如何初始化父类成员?父类构造函数与子类构造函数由什么关系?A.子类对象的构造1.子类在可以定义构造函数2.子类构造函数--必须对继承而来的成员进程初始化(直接通过初始化列表或者赋值的方式进行初始化,调用父类构造函数进行初始化)B.父类构造函数在子类中的调用方式1.默认调用--适用于无参构造函数和使用默认参数的构造函数2.显示调用--通过初始化列表进行调用,适用于所有父类构造函数代码示例 #include <iostream> #include <string&

C++ 类的继承三(继承中的构造与析构)

//继承中的构造与析构 #include<iostream> using namespace std; /* 继承中的构造析构调用原则 1.子类对象在创建时会首先调用父类的构造函数 2.父类构造函数执行结束后,执行子类的构造函数 3.当父类的构造函数有参数时,需要在子类的初始化列表中显示调用 4.析构函数调用的先后顺序与构造函数相反 继承与其他类做成员变量混搭的情况下,构造和析构嗲用原则 1.先构造父类,在构造成员变量,最后构造自己 2.先析构自己,再析构成员变量,最后析构父类 */ clas

C++--第16课 - 继承中的构造与析构

第16课 - 继承中的构造与析构 1. 赋值兼容性原则 (1)      子类对象可以当作父类对象使用. (2)      子类对象可以直接赋值给父类对象. (3)      子类对象可以直接初始化父类对象. (4)      父类指针可以直接指向子类对象. (5)      父类引用可以直接引用子类对象. 子类就是特殊的父类 #include <cstdlib> #include <iostream> using namespace std; class Parent { pro

【C++第十课】---继承中的构造与析构

一.继承中的赋值兼容性原则 1.子类对象可以当作父类对象使用 2.子类对象可以直接赋值给父类对象 3.子类对象可以直接初始化父类对象 4.父类指针可以直接指向子类对象 5.父类引用可以直接引用子类对象 6.子类是就是特殊的父类. 举例说明: #include <iostream> using namespace std; class Parent { protected: const char* name; public: Parent() { name= "Parent ...&q

Swift难点-继承中的构造规则实例详解

一.两种构造器-指定构造器和便利构造器 指定构造器:类中必备的构造器,为所有的属性赋初值.(有些子类可能不需要显示声明,因为默认从基类继承了) 便利构造器:类中的辅助构造器,通过调用指定构造器为属性赋初值.(仅在必要的时候声明) 举例 [plain] view plaincopy class Food { var name: String init(name: String) { self.name = name } convenience init() { self.init(name: "[

继承中的构造与析构(三十九)

我们思考下这个问题:如何初始化父类成员?父类构造函数和子类构造函数有何关系呢?在子类中可以定义构造函数,子类构造函数必须对继承而来的成员进行初始化:a> 直接通过初始化列表或者赋值的方式进行初始化:b> 调用父类构造函数进行初始化. 下来我们来说说父类构造函数在子类中的调用方式,分为两种:a> 默认调用:适用于无参构造函数和使用默认参数的构造函数:b> 显示调用:通过初始化列表进行调用,适用于所有父类构造函数.那么隐式调用是在子类的构造函数中啥都不加,显示调用时在子类构造函数后加上

C++继承中的构造和析构

1,构造:对象在创建的后所要做的一系列初始化的工作: 析构:对象在摧毁之前所要做的一系列清理工作: 2,思考: 1,子类中如何初始化父类成员? 1,对于继承而言,子类可以获得父类的代码,可以获得父类中的成员变量,成员变量从父类中传递到子类,那么子类对象在创建的时候如何初始化从父类中继承的成员变量呢? 2,父类构造函数和子类构造函数有有什么关系? 3,子类对象的构造: 1,子类中可以定义构造函数: 1,子类中定义的新的构造函数,对于子类对象创建的时候必须完成一系列的初始化工作,这些初始化工作包括初

继承中的构造析构函数调用顺序

子类构造函数必须堆继承的成员进行初始化: 1. 通过初始化列表或则赋值的方式进行初始化(子类无法访问父类私有成员) 2. 调用父类构造函数进行初始化 2.1  隐式调用:子类在被创建时自动调用父类构造函数(只能调用父类的无参构造函数和使用默认参数的构造函数) 2.2  显示调用:在初始化列表调用父类构造函数(适用所有的父类构造函数) #include <iostream> #include <string> using namespace std; class PParent //