面向对象三大特性:封装、继承、多态。
继承用于创建可重用、扩展和修改在其他类中定义的行为的新类。 其成员被继承的类称为“基类”,继承这些成员的类称为“派生类”。 派生类只能有一个直接基
类。 但是,继承是可传递的。 如果 ClassB 派生出 ClassC,ClassA 派生出 ClassB,则 ClassC 会继承 ClassB 和 ClassA 中声明的成员。
1、继承的语法
可用下面语法声明类的继承。
public class Chinese:Person { }
所有类都直接或间接继承于object类
2、虚方法
有时候我们继承一个基类的某些方法希望能重新定义这个方法,我们可以把一个基类函数声明virtual,就可以在任何派生类中重写这个函数:
public class Person { public string Name { get; set; } public virtual void Print(Person person) { Console.WriteLine("名字是" + person.Name); } } public class Chinese : Person { public override void Print(Person person) { Console.WriteLine("我是中国人,我的名字是" + person.Name); } }
可在派生类中重写该方法的方法体,但必须显示声明override。
成员字段和静态函数都不能声明为virtual,因为这个概念只对类中的实例函数成员有意义。
3、隐藏方法
如果签名相同的方法在基类和派生类中都进行了声明,但该方法没有分别声明为virtual和 override,派生类方法就会隐藏基类方法。
在C#中,要隐藏一个方法应使用new关键字声明。
在父类类型变量里装子类类型对象,调用父类的虚方法会跳转到子类的重写方法。
new修饰符起到一个截断继承链的作用。
如果只有两个类,子类隐藏了父类方法则会调用父类方法。
class Program { static void Main(string[] args) { AnQing anQing = new AnQing(); AnHui anHui = anQing; Chinese chinese = anQing; Person person = anQing; anQing.Print(); anHui.Print(); chinese.Print(); person.Print(); Console.ReadKey(); } } public class Person { public string Name { get; set; } public void Print() { Console.WriteLine("我是人"); } } public class Chinese : Person { public virtual void Print() { Console.WriteLine("我是中国人" ); } } public class AnHui : Chinese { public override void Print() { Console.WriteLine("我是安徽人"); } } public class AnQing : AnHui { public new void Print() { Console.WriteLine("我是安庆人"); } }
4、调用函数的基类版本
使用base关键字即可在派生类中调用函数的基类版本
5、抽象类和抽象函数
C#允许把类和函数声明为abstract。抽象类不能实例化,而抽象函数不能直接实现,必须在非抽象的派生类中重写。
如果类包含抽象函数,则该类也是抽象的,也必须声明为抽象的。
public abstract class Person { public abstract void Print(); } public class Chinese : Person { public override void Print() { Console.WriteLine("你好"); } }
6、修饰符