委托、多态、继承接口
## 一、知识点文字精简
### 1. 委托 & 多播委托
1. 委托是**方法签名模板**,用来存放格式一致的方法,相当于方法名片。
2. 多播委托依靠 `+=` 添加多个方法、`-=` 移除绑定方法。
3. 执行多播委托时,按照**添加顺序从上到下依次执行所有绑定方法**。
### 2. 虚方法与多态
1. 父类方法加 `virtual`:开放重写权限,允许子类重写。
2. 子类重写同名方法必须加 `override`。
3. 多态口诀:**编译看左边(声明类型),运行看右边(实例对象)**;编译阶段以父类做语法校验,运行时执行子类重写方法。
### 3. 继承 & 接口
1. 类是**单继承**:一个子类只能继承唯一一个父类,不能多类继承。
2. 接口是**多实现**:一个类可以同时实现多个接口,接口只定义行为规范,没有实例字段。
3. 继承复用父类成员,接口约束类必须实现指定方法。
## 二、完整代码示例
### 示例1:委托+多播委托
```csharp
using System;
//定义委托模板
delegate void MsgDel();
class DelegateDemo
{
static void Func1()
{
Console.WriteLine("执行第一个方法");
}
static void Func2()
{
Console.WriteLine("执行第二个方法");
}
static void Main()
{
MsgDel del = Func1;
del += Func2; //多播绑定
del(); //顺序执行Func1、Func2
del -= Func2; //解绑
del(); //只执行Func1
Console.ReadKey();
}
}
```
### 示例2:virtual + override 多态
```csharp
using System;
//父类
public class Animal
{
public virtual void Cry()
{
Console.WriteLine("动物发出叫声");
}
}
//子类重写
public class Dog : Animal
{
public override void Cry()
{
Console.WriteLine("汪汪汪");
}
}
class PolyDemo
{
static void Main()
{
//编译左边是Animal,运行右边是Dog实例,触发多态
Animal a = new Dog();
a.Cry();
Console.ReadKey();
}
}
```
### 示例3:单继承+多接口实现
```csharp
using System;
//定义接口
interface IElectric
{
void Charge();
}
interface IRunning
{
void Run();
}
//父类
class Vehicle
{
public void ShowType()
{
Console.WriteLine("这是交通工具");
}
}
//子类:单继承Vehicle,同时实现2个接口
class ElectricCar : Vehicle, IElectric, IRunning
{
public void Charge()
{
Console.WriteLine("电动车正在充电");
}
public void Run()
{
Console.WriteLine("电动车上路行驶");
}
}
class InterfaceDemo
{
static void Main()
{
ElectricCar car = new ElectricCar();
car.ShowType();
car.Charge();
car.Run();
Console.ReadKey();
}
}
```
## 三、运行结果简要说明
1. 多播委托:先输出两个方法内容,解绑后只输出第一个方法;
2. 多态代码:输出「汪汪汪」而非父类默认叫声;
3. 继承接口:依次打印交通工具、充电、行驶三行内容。
