在一个类中如果需要实现多个自定义构造函数,通常做法是在构造函数中实现各自的业务逻辑,如果这些业务逻辑的实现并非截然不同的话,显然不符合oop编程思想,极不利于维护,当然,我们也可以通过将相同的逻辑部分封装成一个方法,但还有一种更为合理简单的方法,下面就通过this关键字来实现串联构造函数做一简单示例.
1 publicclass Person
2 {
3 publicstring Name { get; set; }
4 publicint? Age { get; set; }
5
6 public Person(string name, int? age)
7 {
8 Name = name;
9 Age = age??100;
10 if (age >100)
11 {
12 Age =80;
13 }
14 }
15
16 public Person() : this("",null) { }
17 public Person(string name) : this(name, null) { }
18 public Person(int age) : this("", age) { }
19 publicvoid Display()
20 {
21 Console.WriteLine("Name:{0},Age:{1}\n", Name, Age);
22 }
23 }
class Program
{
staticvoid Main(string[] args)
{
Person p1 =new Person();
p1.Display();
Person p2 =new Person(50);
p2.Display();
Person p3 =new Person("bobo");
p3.Display();
Person p4 =new Person("BOBO", 110);
p4.Display();

Console.ReadLine();
}

}

这样的做法就是让一个接受参数最多的构造函数做"主构造函数",
且在主构造函数中实现必须的业务逻辑,其余的构造函数只要使用this关键字把传入的参数转发给主构造函数,并且提供必须的其它参数,这样子,我们整个类中需要我们操心的就是那个主构造函数了,其余构造函数基本上可以为空(注意:如果构造函数链中还有实现各自的逻辑,那么实际上是先执行主构造函数的代码,再执行各自逻辑),使用这种做法,真正的工作都交给了一个构造函数,类定义就会更简洁、更易维护、简化了编程任务。
补充下面是java和C#的this构造函数的引用对比,语法上JAVA更简洁
using System;namespace ceshiThis
{/// <summary>/// Description of Preson./// </summary>public class Preson{string name;int age;string address;
//---------------------------------------------------------------------------------------------------------
//   下面是C#中用 this相互调用构造函数
//---------------------------------------------------------------------------------------------------------public Preson():this("",0){System.Console.WriteLine("这是无参构造函数!");}public Preson(string name,int age):this(name,age,""){this.name=name;this.age=age;System.Console.WriteLine("这是两个参数构造函数!");}public Preson(string name,int age,string address){this.address=address;System.Console.WriteLine("这是三个参数构造函数!");}//---------------------------------------------------------------------------------------------------------
//   下面是java中用 this相互调用构造函数
//---------------------------------------------------------------------------------------------------------
//        public Preson()
//        {
//            System.out.println("这是无参构造函数!");
//        }
//
//        public Preson(string name,int age)
//        {
//            this();       //必须第一个调用;
//            this.name=name;
//            this.age=age;
//            System.out.println("这是两个参数构造函数!");
//        }
//
//
//        public Preson(string name,int age,string address)
//        {
//            this(name,age);
//
//            this.address=address;
//            System.out.println("这是三个参数构造函数!");
//        }
//---------------------------------------------------------------------------------------------------
        }
}

转载于:https://www.cnblogs.com/irely520/archive/2011/06/08/2075773.html

this关键字实现串联构造函数调用相关推荐

  1. C++中构造函数调用构造函数

    #include <stdlib.h> #include <iostream> using namespace std;struct CLS {int m_i;CLS( int ...

  2. 类和对象—对象特性—构造函数调用规则

    默认情况下,C++编译器至少给一个类添加三个函数 默认构造函数(无参,函数体为空) 默认析构函数(无参,函数体为空) 默认拷贝构造函数,对属性进行值拷贝 构造函数调用规则如下: 如果用户定义有参构造函 ...

  3. 类和对象—对象特性—拷贝构造函数调用时期

    C++中拷贝构造函数通常有三种情况 使用一个已经建立完毕的对象来初始化一个新对象 值传递的方式给函数参数传值 以值方式返回局部对象 #include <iostream> using na ...

  4. 《从零开始学Swift》学习笔记(Day 42)——构造函数调用规则

    原创文章,欢迎转载.转载请注明:关东升的博客 在构造函数中可以使用构造函数代理帮助完成部分构造工作.类构造函数代理分为横向代理和向上代理,横向代理只能在发生在同一类内部,这种构造函数称为便利构造函数. ...

  5. C++构造函数调用规则

    C++构造函数调用规则 前言 构造函数调用规则如下 示例 前言 默认情况下,c++编译器至少给一个类添加3个函数 1.默认构造函数(无参,函数体为空) 2.默认析构函数(无参,函数体为空) 3.默认拷 ...

  6. C++拷贝构造函数调用时机

    C++拷贝构造函数调用时机 C++中拷贝构造函数调用时机通常有三种情况 示例 C++中拷贝构造函数调用时机通常有三种情况 使用一个已经创建完毕的对象来初始化一个新对象 值传递的方式给函数参数传值 以值 ...

  7. C++ 基类,子对象,派生类构造函数调用顺序

    #include <iostream> using namespace std;class A {public:A( ) {cout << "A Constructo ...

  8. 构造函数调用默认构造函数_显式无参数构造函数与默认构造函数

    构造函数调用默认构造函数 大多数不熟悉Java的开发人员都会Swift了解到,如果他们没有指定至少一个显式构造函数,则会为Java类隐式创建一个" 默认构造函数 "( 由javac ...

  9. Effective C++(9) 构造函数调用virtual函数会发生什么

    问题聚焦: 不要在构造函数和析构函数中调用virtual函数,因为这样的调用不会带来你预想的结果. 让我先来看一下在构造函数里调用一个virtual函数会发生什么结果 Demo class Trans ...

最新文章

  1. 常用容器(Collection)实现类总结(四)——HashSet
  2. while(1)和while(0)
  3. 程序员的10个神秘等式
  4. js日期函数表达天,时,分,秒
  5. 有趣的视频 国外计算机课程
  6. Waveform Audio 驱动(Wavedev2)之:WAV API模拟 1
  7. Xshell 6免费版
  8. 手游php,PHP响应式手游APP软件游戏中心下载网站整站源码(自适应手机移动端) dedecms内核...
  9. 用 Nginx 禁止国外 IP 访问我的网站..
  10. UBNT设置AP模式注意事项
  11. 系统架构改进--多系统用户整合
  12. 顺利通过2021年上工信部的网络工程师考试,在此感悟一下
  13. 七夕甜蜜限定,让你心动不止一点点~
  14. 笔记本电脑wifi怎么连接
  15. Microsoft Edge安装扩展插件
  16. jquery项目实战——爱创课堂专业前端培训
  17. 微信小程序实现首页图片多种排版布局!
  18. 云计算迎来黄金十年,新风向标在哪里?
  19. NBA季后赛总抢断排行榜(数据截止至11年5月5日)
  20. 软件架构设计的底层逻辑

热门文章

  1. LDA总结 (一) 共轭分布
  2. 利用U盘安装windows 7
  3. html动态生成按钮事件无效,【iCheck】通过 JS 动态生成的元素点击无效的解决方法...
  4. 以下构成python循环结构的方法中_《Python程序设计与案例教程》课件chap5循环结构程序设计.ppt...
  5. 业务分析岗所需具备的技能_成功的业务分析师需要具备的3种技能
  6. raspberry pi_如何进行Raspberry Pi聚会
  7. 比特币怎么比特币钱包_5分钟内获得比特币
  8. open vswitch_Linux Foundation采用Open vSwitch,定义了“开放”和更多开源新闻
  9. Bootstrap3 折叠插件的事件
  10. java fx消息通知_如何设置对话框控件Java FX / Java 8的图标