C#面向对象思想之继承介绍
一、引言
开头先来一段代码吧!
using System; namespace cgb { public class ccc { static void Main(string[] args) { } public class Student { private string _name; public string Name { get { return _name; } set { _name = value; } } private int _age; public int Age { get { return _age; } set { _age = value; } } public void f1() { Console.WriteLine("继承"); } public void learn() { Console.WriteLine("学习"); } } public class Teacher { private string _name; public string Name { get { return _name; } set { _name = value; } } private int _age; public int Age { get { return _age; } set { _age = value; } } public void f1() { Console.WriteLine("继承"); } public void teach() { Console.WriteLine("教书"); } } } }
把几个类中重复的成员单独拿出来封装成一个类,作为几个类的父类。
student和teacher重复的成员是属性Name,Age和方法f1()。
修改后的代码如下:
using System; namespace cgb { public class ccc { static void Main(string[] args) { } public class Student : Person { public void learn() { Console.WriteLine("学习"); } } public class Teacher : Person { public void teach() { Console.WriteLine("教书"); } } public class Person { private string _name; public string Name { get { return _name; } set { _name = value; } } private int _age; public int Age { get { return _age; } set { _age = value; } } public void f1() { Console.WriteLine("继承"); } } } }
Student : Person的意思是Student继承于Person。
Student和Teacher是子类,又称派生类;
Person是父类,又称基类。
图片中,新建一个Student类的实例对象,属性Age、Name和方法f1()都是属于Person类的,可见子类是可以用父类的东西的。
二、继承的特性:单根性
Student : Person (对)
Student : Person,Teacher (错)
一个类只能继承于一个父类。一个人只能有一个亲生父亲。
三、继承的特性:传递性
using System; namespace cgb { public class ccc { static void Main(string[] args) { } public class Student : Teacher { public void learn() { Console.WriteLine("学习"); } } public class Teacher : Person { public void teach() { Console.WriteLine("教书"); } } public class Person { private string _name; public string Name { get { return _name; } set { _name = value; } } private int _age; public int Age { get { return _age; } set { _age = value; } } public void f1() { Console.WriteLine("继承"); } } } }
图片中,新建一个Student类的实例对象,属性Age、Name和方法f1()都是属于Person类的,可见Student类还是可以用Person类的东西的。在这里Person类是Student类的爷爷辈了,爷爷的东西是父亲的,父亲的东西是儿子的。
四、子类是否继承父类构造函数?
using System; namespace cgb { public class ccc { static void Main(string[] args) { Student s = new Student(); } public class Student : Person { public void learn() { Console.WriteLine("学习"); } public Student() { } } public class Teacher : Person { public void teach() { Console.WriteLine("教书"); } } public class Person { private string _name; public string Name { get { return _name; } set { _name = value; } } private int _age; public int Age { get { return _age; } set { _age = value; } } public void f1() { Console.WriteLine("继承"); } public Person() { } } } }
断点调试的执行顺序是先执行public Person() { },再执行public Student() { }。
结论:子类并没有继承父类的构造函数。但是,子类会默认调用父类无参数的构造函数,创建父类对象以后,子类才可以用父类里面的属性和方法。
但是如果父类的构造函数是有参数的,如:
public Person(string name, int age) { this.Name = name; this.Age = age; }
如果子类的构造函数还是无参数的话,如:public Student() { },就会报错。
简单来说,就是要一一对应。子类的无参数构造函数对应父类的无参数构造函数,子类的有参数构造函数对应父类的有参数构造函数。
解决方案:
1、在父类中重新写一个无参数的构造函数,就不会报错。
代码如下:
using System; namespace cgb { public class ccc { static void Main(string[] args) { Student s = new Student(); } public class Student : Person { public void learn() { Console.WriteLine("学习"); } public Student() { } } public class Teacher : Person { public void teach() { Console.WriteLine("教书"); } public Teacher() { } } public class Person { private string _name; public string Name { get { return _name; } set { _name = value; } } private int _age; public int Age { get { return _age; } set { _age = value; } } public void f1() { Console.WriteLine("继承"); } public Person(string name, int age) { this.Name = name; this.Age = age; } public Person() { } } } }
2、在子类中显示的调用父类的构造函数,使用关键字:base()。
using System; namespace cgb { public class ccc { static void Main(string[] args) { Student s = new Student("cgb",22); } public class Student : Person { public void learn() { Console.WriteLine("学习"); } public Student(string name,int age):base(name,age) { } } public class Teacher : Person { public void teach() { Console.WriteLine("教书"); } public Teacher(string name, int age) : base(name, age) { } } public class Person { private string _name; public string Name { get { return _name; } set { _name = value; } } private int _age; public int Age { get { return _age; } set { _age = value; } } public void f1() { Console.WriteLine("继承"); } public Person(string name, int age) { this.Name = name; this.Age = age; } } } }
本文地址:https://blog.csdn.net/qq_44978355/article/details/108259032
上一篇: java读取文件夹下的所有文件
下一篇: MySQL数据库——检索数据