C#子类如何调用父类
2014-09-04 09:09
351 查看
C#中子类是如何调用父类的?带着这个问题,体验如下:
□ 通过子类无参构造函数创建子类实例
创建父类Person和子类Student。
在客户端通过子类无参构造函数创建子类实例。
输出结果:
我是人
我是学生
可见:通过调用子类无参构造函数创建子类实例,会默认调用父类无参构造函数。
如果把父类的无参构造函数去掉,会怎样呢?
--结果会报"Person不包含0个参数的构造函数"错。
□ 通过子类有参构造函数创建子类实例
再同时为子类和父类添加有参构造函数。
在客户端通过子类有参构造函数创建子类实例。
输出结果:
我是人
我是学生,我的名字叫小明
可见:通过调用子类有参构造函数,同样默认会调用父类无参构造函数。
□ 在子类中明确指出调用哪个父类构造函数
以上,默认调用了父类的无参构造函数,但如何调用父类的有参构造函数呢?
--在子类中使用base
在子类Student中的有参构造函数中使用base,明确调用父类有参构造函数。
客户端
输出结果:
我是人,我的名字叫小明
我是学生,我的名字叫小明
□ 通过子类设置父类的公共属性
在父类Person中增加一个Name公共属性,并在父类的构造函数中对Name属性赋值。
在客户端:
输出结果:
我是人,我的名字叫小明
我是学生,我的名字叫小明
子类获取父类的Name属性值为小明
以上代码的执行路径是:
→调用子类有参构造函数,并把该参数传值给父类有参构造函数
→调用父类有参构造函数,并给父类公共属性Name赋值
→子类实例调用父类的公共属性
其实,以上的做法在分层架构设计中已经得到了很好的使用。在分层架构中,通常会为所有的Repository创建一个基类,在基类中设计一个代表当前Repository的属性,并在基类的构造函数中为该属性赋值;最终,在创建子类Repository实例时,在为基类的、代表当前Repository的公共属性赋值。
在子类中,当父类通过base拿到子类的参数时,还可以对该产生做一些处理,比如代表父类的base把从子类拿到的参数转换成大写。
输出结果:
我是人,我的名字叫DARREN
我是学生,我的名字叫darren
子类获取父类的Name属性值为DARREN
总结:
● 通过子类无参构造函数创建子类实例,会默认调用父类的无参构造函数
● 通过子类有参构造函数创建子类实例,也会默认调用父类的无参构造函数
● 在子类构造函数中通过base关键字指明父类构造函数,当通过子类构造函数创建实例,会调用指明的、父类的构造函数
● 父类的公共属性可以通过子类来赋值,子类也可以获取到父类的公共属性
□ 通过子类无参构造函数创建子类实例
创建父类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++和java中关于如何调用父类方法和子类方法的辨析
- C++中子类如何调用不同父类中的同名函数?
- C++子类如何调用父类构造函数
- python子类如何才能调用父类的方法?
- C#中通过类来继承两个接口,父类实例化接口中的方法,子类继承父类,调用方法
- php 子类中如何调用父类的变量和方法
- C# 构造函数如何调用父类构造函数或其他构造函数
- 子类如何调用父类方法
- 如何通过父类引用“调用”子类所独有的方法
- c++继承父类的子类,如何调用父类的同名函数?
- c++父类虚函数被子类虚函数覆盖后,如何直接调用父类的虚函数?
- C#中通过类来继承两个接口,父类实例化接口中的方法,子类继承父类,调用方法
- python子类如何调用父类的__init__方法
- C++中子类如何调用不同父类中的同名函数?
- php 子类中如何调用父类的变量和方法
- C#在子类中调用父类的有参构造函数
- 如何在子类外调用父类的方法
- JS中子类中如何调用父类的同名方法(继承时候,父类的同名方法被覆盖了)
- java中如何让一个子类不能调用从父类继承的方法
- 在C#的构造函数中,如何显式的先调用父类或者是自己的构造函数?