继承
一个类可以继承自另一个类,被称为基类(父类)和派生类(子类)。
C# 不支持类的多重继承,但支持接口的多重继承,一个类可以实现多个接口。
概括来说:一个类可以继承多个接口,但只能继承自一个类。
在子类中通过base去调用父类的构造函数和方法
和java类似的继承规则
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
| using System;
class Program { static void Main(string[] args) { Student student = new Student(); student.age = 343; student.name = "tom"; student.sex = '男'; student.getPersonFn(); Console.WriteLine("{0},{1},{2}",student.name,student.age,student.sex); } }
class Person{ public string name; public int age; public char sex;
public void fn(){ Console.WriteLine("我是父类方法"); } }
class Student : Person{ public void getPersonFn(){ base.fn(); } }
|
C#继承的时候,调用父类的方法要使用base关键字
1 2 3 4 5 6 7
| class person{ public person(string obj){} } class student:person{ public sutdent(string obj):base(obj) }
|
1 2 3 4 5 6 7 8
| class person{ public person(string obj){} } class student:person{ public sutdent(string obj){ super(obj) } }
|
二者实现方式类似,都是实例构造器不会被继承
接口
一个接口可以继承自一个或多个其他接口,子接口继承了父接口的所有成员。
子接口可以扩展父接口的成员列表,但不能改变它们的访问修饰符。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24
| using System;
class Program { static void Main(string[] args) { Console.WriteLine("Hello World"); } } interface Person{ void fn(); }
interface Student{ void fn2(); }
interface Student2 : Person,Student{}
class Tom : Student2{ public void fn(){} public void fn2(){} }
|
和java一样,继承了接口,必须重写接口中的方法
抽象方法和虚方法的区别
动态多态性是通过 抽象类 和 虚方法 实现的。
二者都是重写的机制
- 1.虚方法必须有实现部分,抽象方法没有提供实现部分,抽象方法是一种强制派生类覆盖的方法,否则派生类将不能被实例化。
- 2.抽象方法只能在抽象类中声明,虚方法不是。如果类包含抽象方法,那么该类也是抽象的,也必须声明类是抽象的。
- 3.抽象方法必须在派生类中重写,这一点和接口类似,虚方法不需要再派生类中重写。
简单说,抽象方法是需要子类去实现的。虚方法是已经实现了的,可以被子类覆盖,也可以不覆盖,取决于需求。
抽象方法和虚方法都可以供派生类重写。
参考C# 多态性 | 菜鸟教程 (runoob.com)

被virtual修饰的方法就是虚方法,只有虚方法才能被子类重写
