继承

一个类可以继承自另一个类,被称为基类(父类)和派生类(子类)。

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);
//我是父类方法
//tom,343,男
}
}
//父类
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修饰的方法就是虚方法,只有虚方法才能被子类重写