C#中子类是如何调用父类的?带着这个问题,体验如下:

□ 通过子类无参构造函数创建子类实例

创建父类Person和子类Student。

   public class Person
    {
        public Person()
        {
            Console.WriteLine("我是人");
        }
    }

    public class Student : Person
    {
        public Student()
        {
            Console.WriteLine("我是学生");
        }
    }


在客户端通过子类无参构造函数创建子类实例。

    class Program
    {
        static void Main(string[] args)
        {
            Student student = new Student();
            Console.ReadKey();
        }
    }

输出结果:
我是人
我是学生

可见:通过调用子类无参构造函数创建子类实例,会默认调用父类无参构造函数。

如果把父类的无参构造函数去掉,会怎样呢?
--结果会报"Person不包含0个参数的构造函数"错。

□ 通过子类有参构造函数创建子类实例

再同时为子类和父类添加有参构造函数。

    public class Person
    {
        public Person()
        {
            Console.WriteLine("我是人");
        }

        public Person(string name)
        {
            Console.WriteLine("我是人,我的名字叫{0}", name);
        }
    }

    public class Student : Person
    {
        public Student()
        {
            Console.WriteLine("我是学生");
        }

        public Student(string name)
        {
            Console.WriteLine("我是学生,我的名字叫{0}", name);
        }
    }

在客户端通过子类有参构造函数创建子类实例。

 Student student = new Student("小明");
 Console.ReadKey();

输出结果:
我是人
我是学生,我的名字叫小明

可见:通过调用子类有参构造函数,同样默认会调用父类无参构造函数。

□ 在子类中明确指出调用哪个父类构造函数

以上,默认调用了父类的无参构造函数,但如何调用父类的有参构造函数呢?
--在子类中使用base

在子类Student中的有参构造函数中使用base,明确调用父类有参构造函数。

    public class Student : Person
    {
        public Student()
        {
            Console.WriteLine("我是学生");
        }

        public Student(string name)
            : base(name)
        {
            Console.WriteLine("我是学生,我的名字叫{0}", name);
        }
    }


客户端

 Student student = new Student("小明");
 Console.ReadKey();

输出结果:
我是人,我的名字叫小明
我是学生,我的名字叫小明

□ 通过子类设置父类的公共属性

在父类Person中增加一个Name公共属性,并在父类的构造函数中对Name属性赋值。

    public class Person
    {
        public string Name { get; set; }
        public Person()
        {
            Console.WriteLine("我是人");
        }

        public Person(string name)
        {
            this.Name = name;
            Console.WriteLine("我是人,我的名字叫{0}", name);
        }
    }

在客户端:

Student student = new Student("小明");
Console.WriteLine("子类获取父类的Name属性值为{0}", student.Name);
Console.ReadKey();    

输出结果:
我是人,我的名字叫小明
我是学生,我的名字叫小明 
子类获取父类的Name属性值为小明

以上代码的执行路径是:
→调用子类有参构造函数,并把该参数传值给父类有参构造函数
→调用父类有参构造函数,并给父类公共属性Name赋值
→子类实例调用父类的公共属性

其实,以上的做法在分层架构设计中已经得到了很好的使用。在分层架构中,通常会为所有的Repository创建一个基类,在基类中设计一个代表当前Repository的属性,并在基类的构造函数中为该属性赋值;最终,在创建子类Repository实例时,在为基类的、代表当前Repository的公共属性赋值。

在子类中,当父类通过base拿到子类的参数时,还可以对该产生做一些处理,比如代表父类的base把从子类拿到的参数转换成大写。

     public class Student : Person
    {
        public Student()
        {
            Console.WriteLine("我是学生");
        }

        public Student(string name)
            : base(ConvertToUpper(name))
        {
            Console.WriteLine("我是学生,我的名字叫{0}", name);
        }

        private static string ConvertToUpper(string name)
        {
            return name.ToUpper();
        }
    }

输出结果:
我是人,我的名字叫DARREN
我是学生,我的名字叫darren
子类获取父类的Name属性值为DARREN

总结:
● 通过子类无参构造函数创建子类实例,会默认调用父类的无参构造函数
● 通过子类有参构造函数创建子类实例,也会默认调用父类的无参构造函数
● 在子类构造函数中通过base关键字指明父类构造函数,当通过子类构造函数创建实例,会调用指明的、父类的构造函数
● 父类的公共属性可以通过子类来赋值,子类也可以获取到父类的公共属性

C#子类如何调用父类的更多相关文章

  1. 【转】子类会调用父类的@PostConstruct方法

    如果一个类用@Service或@Component,那么只需要用@PostConstruct修饰某个方法,该方法能在类实例化的过程中自动执行,相当于类的构造函数.同时,具备了构造函数不具备的功能. @ ...

  2. 通过supper()有参构造器,完成子类对象调用父类属性的方法,并完成赋值

    package com.Summer_0426.cn; /** * @author Summer * 通过supper()有参构造器,完成子类对象调用父类属性的方法,并完成赋值 * */ public ...

  3. 在子类中调用父类的方法super

    1.没有super之前,在子类里面需要父类里面的逻辑,但是我们是通过派生(自己定义了一个init,增加了一条line) class vehichle:#定义一个交通工具的类 Country=" ...

  4. Python 在子类中调用父类方法详解(单继承、多层继承、多重继承)

    Python 在子类中调用父类方法详解(单继承.多层继承.多重继承)   by:授客 QQ:1033553122   测试环境: win7 64位 Python版本:Python 3.3.5 代码实践 ...

  5. Java子类初始化调用父类无参构造

    实在是服了自己,子类初始化调用父类无参构造这种初学者都应该知道的事,我给忘了. 记得当初看书的时候各种概念抄在笔记本上,再上机实践,以为一辈子都不会忘,还是给忘了. 这件事说明了两个问题: 1.我没有 ...

  6. python基础----继承与派生、组合、接口与归一化设计、抽象类、子类中调用父类方法

    一.什么是继承                                                                          继承是一种创建新的类的方式,在pyth ...

  7. python基础之类的继承与派生、组合、接口与归一化设计、抽象类、子类中调用父类方法

    一.什么是继承 继承是一种创建新的类的方式,新建的类可以继承自一个或者多个父类,原始类称为基类或超类,新建的类称为派生类或子类. 派生:子类继承了父类的属性,然后衍生出自己新的属性,如果子类衍生出的新 ...

  8. c++与java中子类中调用父类成员的方法

    java中: import java.util.Scanner; public class ClassTest{ public static void main(String args[]){ chi ...

  9. 【Python】Python中子类怎样调用父类方法

    python中类的初始化方法是__init__(),因此父类子类的初始化方法都是这个,如果子类不实现这个函数,初始化时调用父类的初始化函数,如果子类实现这个函数,就覆盖了父类的这个函数,既然继承父类, ...

随机推荐

  1. 20165301 2017-2018-2《Java程序设计》课程总结

    20165301 2017-2018-2<Java程序设计>课程总结 每周作业链接汇总 预备作业1:我期待的师生关系 预备作业2:学习基础与c语言学习心得 预备作业3: Linux安装及命 ...

  2. 生成Insert语句的存储过程

    ) drop procedure [dbo].[spGenInsertSQL] GO SET QUOTED_IDENTIFIER OFF GO SET ANSI_NULLS ON GO )) as b ...

  3. Zabbix监控实例

    本节内容: zabbix web添加主机 定义Items 创建graph 创建template 一.zabbix web添加主机 1. 进入zabbix web界面,点击配置—>主机—>创 ...

  4. hdu 5122 (2014北京现场赛 K题)

    把一个序列按从小到大排序 要执行多少次操作 只需要从右往左统计,并且不断更新最小值,若当前数为最小值,则将最小值更新为当前数,否则sum+1 Sample Input255 4 3 2 155 1 2 ...

  5. Hadoop案例(十一)MapReduce的API使用

    一学生成绩---增强版 数据信息 computer,huangxiaoming,,,,,,, computer,xuzheng,,,,, computer,huangbo,,,, english,zh ...

  6. React Native踩坑之FlatList组件中的onEndReached

    最近在做一个RN项目,有使用到FlatList这样一个RN封装的组件去做上拉加载更多功能,在iOS和Android平台上,总结了以下几个遇到的问题及解决方案 1. 进入页面onReached开始就被触 ...

  7. SpringMvc和servlet对比

    一.servlet实现登录. 咱们先来看一下servlet实现注册登录. <servlet> <servlet-name>LoginServlet</servlet-na ...

  8. 使用DNSPod域名解析

    1 在GoDaddy域名注册商 注册域名 https://sg.godaddy.com/zh/ 2 登陆DNSPod https://www.dnspod.cn 3 选择域名解析 添加域名 4 添加记 ...

  9. python 模式之工厂模式

    转自:https://www.cnblogs.com/lizhitai/p/4471952.html 工厂模式是一个在软件开发中用来创建对象的设计模式. 工厂模式包涵一个超类.这个超类提供一个抽象化的 ...

  10. 富文本插件KindEditor

    具体用法查看官网http://kindeditor.net/doc.php {% load staticfiles %} <!DOCTYPE html> <html lang=&qu ...