C#中子类调用父类的实现方法
本文实例讲述了C#中实现子类调用父类的方法,分享给大家供大家参考之用。具体方法如下:
一、通过子类无参构造函数创建子类实例
创建父类Person和子类Student。
|
1
2
3
4
5
6
7
8
9
10
11
12
13
14
|
public class Person { public Person() { Console.WriteLine("我是人"); } } public class Student : Person { public Student() { Console.WriteLine("我是学生"); } } |
在客户端通过子类无参构造函数创建子类实例。
|
1
2
3
4
5
6
7
8
|
class Program { static void Main(string[] args) { Student student = new Student(); Console.ReadKey(); } } |
输出结果:
|
1
2
|
我是人 我是学生 |
可见:通过调用子类无参构造函数创建子类实例,会默认调用父类无参构造函数。
如果把父类的无参构造函数去掉,会怎样呢?
--结果会报"Person不包含0个参数的构造函数"错。
二、通过子类有参构造函数创建子类实例
再同时为子类和父类添加有参构造函数。
|
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
|
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); } } |
在客户端通过子类有参构造函数创建子类实例。
|
1
2
|
Student student = new Student("小明"); Console.ReadKey(); |
输出结果:
|
1
2
|
我是人 我是学生,我的名字叫小明 |
可见:通过调用子类有参构造函数,同样默认会调用父类无参构造函数。
三、在子类中明确指出调用哪个父类构造函数
以上,默认调用了父类的无参构造函数,但如何调用父类的有参构造函数呢?
--在子类中使用base
在子类Student中的有参构造函数中使用base,明确调用父类有参构造函数。
|
1
2
3
4
5
6
7
8
9
10
11
12
|
public class Student : Person { public Student() { Console.WriteLine("我是学生"); } public Student(string name) : base(name) { Console.WriteLine("我是学生,我的名字叫{0}", name); } } |
客户端
|
1
2
|
Student student = new Student("小明"); Console.ReadKey(); |
输出结果:
|
1
2
|
我是人,我的名字叫小明 我是学生,我的名字叫小明 |
四、通过子类设置父类的公共属性
在父类Person中增加一个Name公共属性,并在父类的构造函数中对Name属性赋值。
|
1
2
3
4
5
6
7
8
9
10
11
12
13
|
public class Person { public string Name { get; set; } public Person() { Console.WriteLine("我是人"); } public Person(string name) { this.Name = name; Console.WriteLine("我是人,我的名字叫{0}", name); } } |
在客户端:
|
1
2
3
|
Student student = new Student("小明"); Console.WriteLine("子类获取父类的Name属性值为{0}", student.Name); Console.ReadKey(); |
输出结果:
|
1
2
3
|
我是人,我的名字叫小明 我是学生,我的名字叫小明 子类获取父类的Name属性值为小明 |
以上代码的执行路径是:
→调用子类有参构造函数,并把该参数传值给父类有参构造函数
→调用父类有参构造函数,并给父类公共属性Name赋值
→子类实例调用父类的公共属性
其实,以上的做法在分层架构设计中已经得到了很好的使用。在分层架构中,通常会为所有的Repository创建一个基类,在基类中设计一个代表当前Repository的属性,并在基类的构造函数中为该属性赋值;最终,在创建子类Repository实例时,在为基类的、代表当前Repository的公共属性赋值。
在子类中,当父类通过base拿到子类的参数时,还可以对该参数做一些处理,比如代表父类的base把从子类拿到的参数转换成大写。
|
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
|
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(); } } |
输出结果:
|
1
2
3
|
我是人,我的名字叫DARREN 我是学生,我的名字叫darren 子类获取父类的Name属性值为DARREN |
总结:
①.通过子类无参构造函数创建子类实例,会默认调用父类的无参构造函数
②.通过子类有参构造函数创建子类实例,也会默认调用父类的无参构造函数
③.在子类构造函数中通过base关键字指明父类构造函数,当通过子类构造函数创建实例,会调用指明的、父类的构造函数
④.父类的公共属性可以通过子类来赋值,子类也可以获取到父类的公共属性
相信通过本文上述实例的分析,可以加深大家对C#类的初始化与继承的理解。希望本文所述对大家进一步的学习C#程序设计有所帮助。
C#中子类调用父类的实现方法的更多相关文章
- python中子类调用父类的方法
1子类调用父类构造方法 class Animal(object): def __init__(self): print("init Animal class~") def run( ...
- JavaScript中子类调用父类方法的实现
一.前言 最近在项目中,前端框架使用JavaScript面向对象编程,遇到了诸多问题,其中最典型的问题就是子类调用父类(super class)同名方法,也就是如C#中子类中调用父类函数base.** ...
- 关于Java中子类调用父类方法
当一个类继承于另一个类,子类中没有父类的方法时.用子类的对象调用方法时,会首先在子类中查找,如果子类中没有改方法,再到父类中查找. 当一个方法只在父类中定义时,调用该方法时会使用父类中的属性. 如果该 ...
- [转]Java中子类调用父类构造方法的问题分析
在Java中,子类的构造过程中,必须调用其父类的构造函数,是因为有继承关系存在时,子类要把父类的内容继承下来,通过什么手段做到的? 答案如下: 当你new一个子类对象的时候,必须首先要new一个 ...
- python 子类调用父类成员的方法
1.直接写类名调用: parent_class.parent_attribute(self) class Animal(): def __init__(self, name): self.name = ...
- java继承-子类调用父类的方法中包含子类重写的方法
# 看题目是不是很绕,这个我也不知道怎么才能更简单的表达了... # 先看代码: public class Common { public static void main(String[] args ...
- 在C++中子类继承和调用父类的构造函数方法
构造方法用来初始化类的对象,与父类的其它成员不同,它不能被子类继承(子类可以继承父类所有的成员变量和成员方法,但不继承父类的构造方法).因此,在创建子类对象时,为了初始化从父类继承来的数据成员,系统需 ...
- python子类调用父类的方法
python子类调用父类的方法 python和其他面向对象语言类似,每个类可以拥有一个或者多个父类,它们从父类那里继承了属性和方法.如果一个方法在子类的实例中被调用,或者一个属性在子类的实例中被访问, ...
- 【转】子类会调用父类的@PostConstruct方法
如果一个类用@Service或@Component,那么只需要用@PostConstruct修饰某个方法,该方法能在类实例化的过程中自动执行,相当于类的构造函数.同时,具备了构造函数不具备的功能. @ ...
随机推荐
- 创建动态组-以OU为单位
选择“Windows 计算机”为对象,因为监视对象是以计算机为单位 ==================== 以下方式则无组成员返回: 此时要求返回的对象为AD用户或组,猜测SCOM没有监视到该用户或 ...
- 函数定义从零开始学C++之从C到C++(一):const与#define、结构体对齐、函数重载name mangling、new/delete 等
今天一直在学习函数定义之类的问题,下午正好有机会和大家共享一下. 一.bool 类型 逻辑型也称布尔型,其取值为true(逻辑真)和false(逻辑假),存储字节数在不同编译系统中可能有所不同,VC+ ...
- Java log code example
Java log example Logrecord filter import java.util.logging.Filter; import java.util.logging.Level; i ...
- [ES6] 17. Set
Es6 provides "Set", it likes array but the data inside should be unqiue. "Set" i ...
- MySQL 子查询 EXISTS 和 NOT EXISTS(转)
MySQL EXISTS 和 NOT EXISTS 子查询 MySQL EXISTS 和 NOT EXISTS 子查询语法如下: SELECT ... FROM table WHERE EXISTS ...
- Blueprint编译过程
Blueprint 编译概述 一.术语 Blueprint,像C++语言一下的,在游戏中使用前须要编译.当你在BP编辑器中,点击编译button时候.BP资源開始把属性和图例过程转换为一个类对象处理. ...
- Flex中 Array 的IndexOf 的作用
Flex中 Array 的IndexOf 的作用 1.说明 indexOf用于在索引中从小到大查找,假设查得到就返回索引值,查不到就返回-1: 2.实例 (1)设计源代码 <?xml ve ...
- C++指针和引用
★ 相同点: 1. 都是地址的概念: 指针指向一块内存,它的内容是所指内存的地址:引用是某块内存的别名. ★ 区别: 1. 指针是一个实体,而引用仅是个别名: 2. 引用使用时无需解引用(*),指 ...
- MySQL · BUG分析 · Rename table 死锁分析
http://mysql.taobao.org/monthly/2016/03/06/ 背景 InnoDB buffer pool中的page管理牵涉到两个链表,一个是lru链表,一个是flush 脏 ...
- mysql并发复制系列 一:binlog组提交
http://blog.itpub.net/28218939/viewspace-1975809/ 作者:沃趣科技MySQL数据库工程师 麻鹏飞 MySQL Binary log在MySQL 5. ...