# 第六课：继承和接口

## 继承（Inheritance）

子类继承父类的属性和方法，避免重复代码。

```csharp
// 父类
class Animal
{
    public string name;
    public void Eat()
    {
        Console.WriteLine($"{name} 在吃东西");
    }
}

// 子类
class Dog : Animal
{
    public void Bark()
    {
        Console.WriteLine($"{name} 在叫: 汪汪!");
    }
}
```

```csharp
Dog dog = new Dog();
dog.name = "旺财";
dog.Eat();   // 继承自 Animal
dog.Bark();  // 自己独有的
```

## 方法重写（override）

```csharp
// 父类 virtual 方法
class Animal
{
    public string name;
    public virtual void Speak()
    {
        Console.WriteLine($"{name} 发出了声音");
    }
}

// 子类重写
class Cat : Animal
{
    public override void Speak()
    {
        Console.WriteLine($"{name} 喵喵喵~");
    }
}
```

```csharp
Animal a = new Cat();
a.name = "小猫";
a.Speak();  // 输出: 小猫 喵喵喵~
```

## base 关键字

子类调用父类的方法/构造函数：

```csharp
class Dog : Animal
{
    public string breed;

    public Dog(string name, string breed) : base(name)
    {
        this.breed = breed;
    }

    public override void Speak()
    {
        base.Speak();  // 先调用父类方法
        Console.WriteLine($"{name} 汪汪!");
    }
}
```

## 访问修饰符 protected

| 修饰符 | 任何地方 | 继承访问 |
|--------|----------|----------|
| `private` | ✗ | ✗ |
| `protected` | ✗ | ✓ |

```csharp
class Animal
{
    protected string name;  // private 的话子类也访问不到
}

class Dog : Animal
{
    public void Test()
    {
        name = "旺财";  // protected 可以访问
    }
}
```

## 接口（Interface）

接口 = 约定/契约，定义必须实现的方法。

```csharp
// 定义接口
interface IFlyable
{
    void Fly();           // 不写实现
    int MaxAltitude { get; }  // 可以有属性
}

// 实现接口
class Bird : IFlyable
{
    public int MaxAltitude => 1000;

    public void Fly()
    {
        Console.WriteLine("鸟儿在飞翔");
    }
}

class Plane : IFlyable
{
    public int MaxAltitude => 10000;

    public void Fly()
    {
        Console.WriteLine("飞机在飞翔");
    }
}
```

## 接口 vs 继承

| | 继承 | 接口 |
|---|---|---|
| 关键词 | `class A : B` | `class A : IB` |
| 只能继承一个父类 | ✓ | 可以实现多个接口 |
| 继承获得代码 | ✓ | 只获得"约定" |
| 何时用 | 代码复用 | 约定行为 |

```csharp
// 一个类只能继承一个父类
class Dog : Animal { }

// 但可以实现多个接口
class Duck : Animal, IFlyable, ISwimable
{
    public void Fly() { }
    public void Swim() { }
}
```

## 例子：设备驱动架构

```csharp
// 设备接口
interface IDevice
{
    void Connect();
    void Disconnect();
    bool IsConnected { get; }
}

// 麦克风设备
class Microphone : IDevice
{
    public bool IsConnected { get; private set; }

    public void Connect()
    {
        Console.WriteLine("麦克风连接");
        IsConnected = true;
    }

    public void Disconnect()
    {
        Console.WriteLine("麦克风断开");
        IsConnected = false;
    }
}
```
