继承
创建对象的时候会先执行构造方法,要是子类继承父类的话,创建子类对象会默认执行父类的无参构造函数。base()会让其先执行父类有参的构造函数
我们可能会在一些类中,写一些重复的成员,我们可以将这些重复的成员,
单独的封装到一个类中,作为这些类的父类。
Student、Teacher、Driver 子类 派生类
Person 父类 基类
子类继承了父类,那么子类从父类那里继承过来了什么?
首先,子类继承了父类的属性和方法,但是子类并没有继承父类的私有字段。
问题:子类有没有继承父类的构造函数?
答:子类并没有继承父类的构造函数,但是。子类会默认的调用父类无参数的构造函数,
创建父类对象,让子类可以使用父类中的成员。
所以,如果在父类中重新写了一个有参数的构造函数之后,那个无参数的就被干掉了,
子类就调用不到了,所以子类会报错。
解决办法:
1)、在父类中重新写一个无参数的构造函数。
2)、在子类中显示的调用父类的构造函数,使用关键字:base()
6、继承的特性
1、继承的单根性:一个子类只能有一个父类。
2、继承的传递性
object是所有类的基类。
new关键字
1)、创建对象
2)、隐藏从父类那里继承过来的同名成员。
隐藏的后果就是子类调用不到父类的成员。
继承的一个例子(为方便浏览所有的类写在一个类文件中)
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 |
namespace 继承 { class Program { static void Main(string[] args) { Student s = new Student("张三",'男',34); s.Learn(); } } public class Preson//创建一个父类 { private string _name; public string Name { get { return _name; } set { _name = value; } } private char _sex; public char Sex { get { return _sex;} set { _sex=value;} } //public void Eat()//父类方法 //{ // Console.Write("姓名:{0}性别{1}",this.Name,this.Sex); // Console.ReadKey(); //} public Preson(string name,char sex)//父类构造方法 { this.Name = name; this.Sex = sex; } } public class Student:Preson//子类继承父类 { public Student(string name, char sex, int sno) : base(name,sex)//显性继承父类有参的构造方法 { this.Sno = sno; } private int _sno; public int Sno { get { return _sno; } set { _sno = value; } } public void Learn()//子类方法 { Console.Write("姓名:{0}性别{1}学号是{2}",this.Name,this.Sex,this.Sno); Console.ReadKey(); } } |
实例二:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 |
static void Main(string[] args) { Teacher s = new Teacher("张三",'男',12,"十四年"); s.js(); } public class Prson//父类 { private string _name; public string Name { get { return _name; } set { _name = value; } } private char _Sex; public char Sex { get { return _Sex; } set { _Sex = value; } } private int _age; public int Age { get { return _age; } set { _age = value; } } public Prson(string name,char sex,int age)//父类的构造方法 { this.Name = name; this.Sex = sex; this.Age = age; } } public class Teacher:Prson { private string _experience; public string Experience { get { return _experience; } set { _experience = value; } } public Teacher(string name, char sex, int age, string experence) : base(name, sex, age)//base(name,sex,age)表示只继承父类有参构造函数中的 (姓名 性别 年龄)字段 { this.Experience = experence; } public void js()//方法 { Console.WriteLine("我叫{0}是一名老师今年{1}岁性别{2}教书经验{3}", this.Name, this.Age, this.Sex,this.Experience); } |