继承
在编码中会发现有些类中的代码有重复的部分,把这部分重复的部分提取并封装成一个基类,然后让子类继承该基类从而实现代码的重复使用,就是继承,继承解决了代码的冗余
如果一个类继承了另一个类,则该类被称为子类/派生类,被继承的类被称为父类/基类
语法 :被继承的类名称
子类和父类
子类继承了父类的属性和方法
私有字段不能被继承(应为字段都是被private修饰的)
构造函数不能被继承,但是父类的构造函数会被子类调用
子类继承了父类,可以使用父类的属性和方法,也可以具有自己的属性和方法
如果父类里面重构了构造函数,则父类里面默认的无参的构造函数将不再存在,这时候子类会编译出错(因为子类会默认的调用父类无参的构造函数,但是现在父类里面无参的构造函数已经不存在),解决的办法有两个
在子类里面重新创造一个无参的构造函数,让子类可以继续调用无参的构造函数
在子类里面明确需要调用的父类的构造函数,如下示例
在父类创建一个构造函数,如下
public Person(string name,int age,char gender)
{
this.Name = name;
this.Age = age;
this.Gender = gender;
}
在子类中创建构造函数,并且使用[:base()关键字]来显示的调用父类的构造函数
public Student(string name, int age, char gender, int id)
: base(name, age, gender)
{
this.Id = id;
}
在创建学生类的是后可以按如下方式
Student st = new Student("张三", 19, '男', 120);
Console.WriteLine("我叫{0},我今年{1}岁了,我是{2}生,我的学号是{3}", st.Name, st.Age, st.Gender, st.Id);
Console.ReadKey();
继承的两个特性
单根性:一个子类只能有一个父类
传递性:子类可以继承父类的属性和方法,而且该子类的属性和方法可以被该子类的子类继承
object是所有类型的父类
自动属性
public string Name
{
get;
set;
}
自动属性没有显示的字段,但是会自动为其创建一个对应的隐式的字段
自动属性没法再get与set方法里面写判断信息,如果要对字段内容进行判断只能在构造函数或者在代码汇总书写,这点对于属性来说是不方便的地方
new的作用
创建对象,对类进行实例化
隐藏从父类哪里继承的成员,示例如下
父类中有个方法
public class Person
{
public void SayHello()
{
Console.WriteLine("你好");
}
}
子类继承父类,然后里面有一个相同的方法
public class Student : Person
{
public new void SayHello()
{
Console.WriteLine("大家好");
}
}
如果在子类中,SayHello()前面没有增加关键字new,会提示Student.SayHell0()隐藏了继承的成员Person.SayHello,如果是有意隐藏请,使用关键字new,加上new,就可以隐藏从父类继承的方法SayHello()
this的作用
代表当前类的对象
显示的调用自己的构造函数
如下面重构了三个构造函数,入参列表都不相同,为了不重新赋值代码,可以直接调用自身的构造函数来赋值
public Student(string name, int age, char gender, int id)
: base(name, age, gender)
{
this.Id = id;
}
public Student(string name, int age, char gender)
: this(name, age, gender, 0)
{
}
public Student(string name, char gender)
: this(name, 0, gender, 0)
{
}
里氏转换
子类可以赋值给父类
如果这个父类中装的是子类对象,那么可以将这个父类强转为对应的子类
//子类可以赋值给父类
Student s = new Student();
Person p = s;
Person p1 = new Student();
//如果父类中装的是子类的对象,则可以把这个父类强转为子类对象
Student s1 = (Student)p1;
如果有一个地方需要传入一个父类,可以使用子类作为作为代替参数传入
在转换之前可以先判断是否可以转换
is:如果转换成功返回true,否则返回false,主要用来判断
if (p1 is Student)
{
Student s1 = (Student)p1;
}
else
{
Console.WriteLine("转换失败");
}
as:如果转换成功,则返回转换对的对象,如果转换失败则返回null,主要用来直接转换
Student s1=p1 as Student;