• 博客园logo
  • 会员
  • 众包
  • 新闻
  • 博问
  • 闪存
  • 赞助商
  • HarmonyOS
  • Chat2DB
    • 搜索
      所有博客
    • 搜索
      当前博客
  • 写随笔 我的博客 短消息 简洁模式
    用户头像
    我的博客 我的园子 账号设置 会员中心 简洁模式 ... 退出登录
    注册 登录
jk-2048
博客园    首页    新随笔    联系   管理    订阅  订阅
刘铁猛C#学习笔记19 抽象类、接口与SOLID五大原则
接口与抽象类是所有高阶面向对象的起点,是学习设计模式的前置条件
必须有实践基础之后,才能真正掌握算法、设计模式
 
设计模式的基础

solid五大设计原则(待续)

1.单一职责原则

single responsibility principle

2.开放-关闭原则

Open-close principle,简称为开闭原则
“封装确定的,开放不确定的,不确定的推迟到合适的子类中去实现”

3.替换原则

4.接口隔离原则

详见学习笔记20

5.依赖反转原则

(Dependency inversion principle,简称DIP)
使得高层次的模块(功能调用者)不依赖于低层次的模块(功能提供者)的实现细节,
依赖关系被颠倒(反转),从而使得低层次模块依赖于高层次模块的需求抽象
从调用者依赖提供者的功能,转换为提供者依赖调用者给出的需求

抽象类abstract

概念定义

抽象类指“成员没有被完全实现的类”
如下这样,在声明类时abstract修饰符
包含用abstract修饰的成员方法没有方法体(称作未被实现)
这样的抽象方法不能是private的,因为实现这个方法的一定是抽象类的子类
一旦被abstract修饰,就不能有任何的逻辑实现,大括号都没有
抽象方法在C++中也称作“纯虚函数”
抽象类不能被实例化
 

抽象类两大功能

1.作为基类去派生出子类

2.声明变量去装子类实例

 

实例程序讲解

声明一个小汽车类、卡车类,发现二者的Stop方法完全一致
违反了“不能复制粘贴原则”,出现了未能复用的完全相同代码
 
于是为他们建立一个基类,使用虚方法重写、多态来复用代码
但发现一个问题,父类的虚方法的方法体,似乎永远不会被用到
干脆不写虚方法的方法体,让他变成“纯虚方法”,在C#中就是抽象方法
但抽象方法所在的类也必须加修饰符变成抽象类
 
这样添加新子类时不用动父类代码,符合开闭原则
在继承自抽象父类的子类声明时,会划红线
提示是否在此继承层级进行抽象方法的实现
若不实现,则此子类也必须写为抽象类
抽象方法实现时必须被重写(写上override修饰符)
抽象类就是专为作基类而生的
 
有没有一种可能,一个类中所有成员都是抽象成员
“非常抽象的抽象类”、“纯抽象类”
fill、stop方法在vechicle一级实现,run方法在再下一级实现
这种“纯抽象类”在C#中就是 接口interface

接口interface

使用关键字interface将原本的类标识为接口
因为纯抽象类的成员一定是公开的、抽象的,所以之前写的abstract、public修饰符可以去掉
在实现抽象方法时,重写修饰符override也应该去掉

未实现方法的向下传递

需要在此层级类中写上完整抽象方法声明,将该方法的实现在继承链上往下推
因为是用抽象方法向下传递的,到再下一层时此方法来自一个抽象类,而非完整的接口
所以在接口的下下层要实现该方法时需要写上重写override修饰符
 

接口命名规范

接口命名时,在单词前写上字母"I"表接口interface
 
 

小结

抽象类、接口是软件工程实践的产物,是为了提高工程质量总结出的
抽象类是 未完全实现成员 的类
接口(纯抽象类)是 完全未实现成员 的类
抽象类是为复用、作为基类而生
接口的为解耦而生(待续)
 
posted on 2024-02-23 23:25  JK降谷羽  阅读(86)  评论(0)    收藏  举报
刷新页面返回顶部
博客园  ©  2004-2025
浙公网安备 33010602011771号 浙ICP备2021040463号-3