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. java 闭包与回调

    闭包(closure)是一个可调用的对象,它记录了一些信息,这些信息来自于创建它的作用域. 内部类是面向对象的闭包,因为它不仅包含外围类对象(创建内部类的作用域)的信息,还自动拥有一个指向此外围类对象 ...

  2. (一)问候 Log4j 你好

    第一节: Log4j 简介 Log4j -------- log for java(java的日志) 是java主流的日志框架,提供各种类型,各种存储,各种格式,多样化的日志服务: 在爬虫领域,主要用 ...

  3. Linux学习笔记:644、755、777权限详解

    一.问题 1.在Linux或者Android系统下用命令ll或者ls -la的时候会看到前面-rw-rw-r--一串字符,不知道代表什么? 2.新建vi一个文件之后,经常需要chmod 755 fil ...

  4. SCTF 2015 pwn试题分析

    Re1 是一个简单的字符串加密.程序使用了多个线程,然后进行同步.等加密线程加密好了之后才会启动验证线程.这个题比较坑的是IDA F5出来的结果不对,不知道是不是混淆机制. 刚开始看的是F5后的伪代码 ...

  5. php 根据ip获取城市以及网络运营商名称(利用qqwry.dat)

    根据用户IP地址判定出所在城市以及网络运营商 qqwry.dat下载地址:http://files.cnblogs.com/guangxiaoluo/qqwry.rar  解压出来即可 //获取用户真 ...

  6. BZOJ2152 [国家集训队] 聪聪可可 [点分治]

    题目传送门 聪聪可可 Time Limit: 3 Sec  Memory Limit: 259 MBSubmit: 5237  Solved: 2750[Submit][Status][Discuss ...

  7. Windows 服务器部署 asp.net core

    踩坑日记与 Windows 服务器部署 asp.net core 指南. 准备 操作系统:Windows Server 2008 R2 或更高版本 文件: Microsoft Visual C++ 2 ...

  8. CentOS7中热插拔硬盘如何读取新的硬盘

    在服务器或虚拟机上,一般会实现热插拔硬盘.此时CentOS7是无法读到新盘的,所以需要重新扫描. 我们添加一个新的硬盘演示: [root@xuexi ~]# ls /dev/sd* //应该还有一个s ...

  9. Linux教程 - 管道和重定向

      管道和重定向! 保持数据流动 介绍   在前两节中,我们看了一些可以为我们操作数据的过滤器.在本节中,我们将看到我们如何将它们结合在一起来执行更强大的数据操作. 本节涉及一些阅读.即使这些机制及其 ...

  10. 安装ffmpeg

    安装2个源 centos7.2 1.yum install -y epel-release 2.rpm -Uvh http://li.nux.ro/download/nux/dextop/el7/x8 ...