博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
C#子类如何调用父类
阅读量:5812 次
发布时间:2019-06-18

本文共 2493 字,大约阅读时间需要 8 分钟。

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关键字指明父类构造函数,当通过子类构造函数创建实例,会调用指明的、父类的构造函数
● 父类的公共属性可以通过子类来赋值,子类也可以获取到父类的公共属性

转载地址:http://qevbx.baihongyu.com/

你可能感兴趣的文章
云原生的浪潮下,为什么运维人员适合学习Go语言?
查看>>
Webpack入门教程三十
查看>>
EAServer 6.1 .NET Client Support
查看>>
锐捷交换机密码恢复(1)
查看>>
Kali linux virtualbox rc=1908 错误解决办法
查看>>
linux软件包管理之三(源代码安装)
查看>>
数据库三范式是什么?
查看>>
[转载]设置Ubuntu自动连接无线,无须再输入密钥环和无线密码
查看>>
九叔Xen App测试报告
查看>>
Apache配置
查看>>
Ext gridPanel 单元格数据的渲染
查看>>
Android SDK 的下载代理
查看>>
Method Swizzling对Method的要求
查看>>
佛祖保佑,永不宕机
查看>>
四、配置开机自动启动Nginx + PHP【LNMP安装 】
查看>>
LNMP一键安装
查看>>
SQL Server数据库概述
查看>>
Linux 目录结构及内容详解
查看>>
startx命令--Linux命令应用大词典729个命令解读
查看>>
华为3026c交换机配置tftp备份命令
查看>>