一、继承
1.区别于java使用的extends,c#使用“:”
2.子类继承父类,父类派生子类。父类-基类,子类-派生类。
3.java使用super代表父类,c#使用base代表父类
4.当调用子类构造器创建对象的时候会自动调用父类的默认构造器,该种调用属于隐式调用。由此可见,当编写父类有参构造器的时候,必须手动添加无参构造器。
5.显式调用父类有参构造器:
父类:
public Employee(string id,int age,string name,string gender)
{
this.ID = id;
this.Age = age;
this.Name = name;
this.Gender = gender;
}
子类:
class PM:Employee
{
public PM(string id, int age, string name, string gender, int yearOfExperience):base(id,age,name,gender)
{
//this.ID = id;
//this.Age = age;
//this.Name = name;
//this.Gender = gender;
this.yearOfExperience = yearOfExperience;
}
}
P.S.
1.“:”不可缺
2.参数名必须完全相同,包括父类构造器的参数,子类构造器的参数,以及子类显式调用父类构造器的参数
6.特例:当子类无参构造器调用父类有参构造器的时候,必须给参数赋值。
7.c#使用"is"关键字来判断两者是否有继承关系,该关键字返回boolean结果(相比下,java使用"instanceOf")
8.继承具有传递性,子类不能同时继承多个父类。用sealed类修饰的类叫做密封类,无法被继承(相比下,java使用final)。
二、多态
1.虚方法:virtual
2.重写:override
3.父类定义的虚方法不一定要被子类重写。若不重写父类虚方法,则依然执行父类的默认实现;若重写父类虚方法,则执行子类重写后的方法。
4里氏替换原则:
子类可以替换父类并且出现在父类能够出现的任何地方,且程序的行为不会发生变化(但是父类对象不能替换子类对象)
5.as操作符:进行类型转换不会产生异常,转换失败会返回null。类似于强转,as前强转为as后
6.抽象abstract
1).抽象类不能密封或者静态的。
2).快速生成重写抽象方法:shift+alt+F10+enter(光标放在继承的父类上,父类必须是abstract抽象类和抽象方法)
3).子类必须重写抽象类方法,重写抽象类后的方法样式和重写虚方法的样式一模一样。