12.1 抽象类
定义抽象类
1 | public abstract class Shape |
实现抽象类
1 | public class Rectangle : Shape |
12.2 抽象类特点
- 不能直接实例化
- 可以包含抽象成员和普通成员
- 派生类必须实现所有抽象成员
- 用于定义相关类的共同基类
1 | // Shape shape = new Shape(); // 错误:不能实例化抽象类 |
12.3 接口定义
基本接口
1 | public interface IRepository<T> |
接口实现
1 | public class ProductRepository : IRepository<Product> |
12.4 接口特点
- 只能包含方法、属性、事件、索引器签名
- 所有成员默认 public,不能指定访问修饰符
- 类可以实现多个接口
- 接口可以继承接口
1 | public interface IDrawable |
12.5 显式接口实现
1 | public interface IWorker |
12.6 接口继承
1 | public interface IAnimal |
12.7 默认接口方法(C# 8+)
1 | public interface ILogger |
12.8 抽象类 vs 接口
| 特性 | 抽象类 | 接口 |
|---|---|---|
| 实例化 | 不能 | 不能 |
| 成员实现 | 可以有 | C# 8+ 可以有默认实现 |
| 字段 | 可以有 | 不能有 |
| 构造函数 | 可以有 | 不能有 |
| 继承 | 单继承 | 多实现 |
| 访问修饰符 | 支持 | 默认 public |
| 用途 | “是什么” | “能做什么” |
选择建议
1 | // 使用抽象类:相关类共享代码 |
12.9 本章小结
- 抽象类使用
abstract关键字,不能实例化 - 抽象成员必须在派生类中实现
- 接口定义契约,类可实现多个接口
- 显式接口实现解决命名冲突
- 接口可以继承其他接口
- C# 8+ 支持默认接口方法
- 抽象类用于”是什么”,接口用于”能做什么”
练习题
- 创建抽象类
Employee,派生Manager和Developer - 定义
IPrintable接口,实现打印功能 - 使用显式接口实现解决冲突
- 以下代码能否编译?
1
2interface ITest { void Method(); }
class Test : ITest { private void Method() { } }