面向对象方法的基本思想 面向对象设计思想是什么

主流的编程范式有三种:面向过程、面向对象和函数式编程 , 我们现在使用的主流编程语言 C# 或 Java , 都是面向对象语言 , 所以常常说的设计模式也是在面向对象语言这个前提之下 。
面向对象的基础知识和一些设计原则 , 我认为是学习设计模式的基础 , 本文就聊下这些基础知识 。
在面试时 , 一问到面向对象 , 几乎每个人都能脱口而出:封装、继承、多态 。但大部分只能说出一个简单的概念 , 而多态还有很多连概念都说不清楚 。我们学习面向对象 , 不止需要了解概念 , 更需要知道每个特性存在的意义和目的 。
对于面向对象的特性 , 面向对象的语言都会给出相应的支持 , 不同语言可能会有细微差别 , 下面的示例以 C# 语言为主 。
封装我们先来思考下 , 平时写代码时有哪些是属于封装 , 是不是会有下面的一些场景:
1、将一些属性字段放到一个类中;
2、将一些方法放到一个类中
3、将某些类组织到某个特定的命名空间下 。
而在 C# 9.0 版本中还提供了属性的 init 特性 , 可以更方便地提供封装性:
public class UserInfo{public string Name { get; init; }}UserInfo user = new UserInfo { Name = "oec2003" };//当 user 初始化完了之后就不能再改变 Name 的值user.Name = "oec2004";除了属性、方法和类也有对应的访问修饰符 , 这些访问修饰符的灵活运用就达到了封装的目的 , 用来隐藏信息或进行数据的保护 。
试想一下 , 如果我们对类中属性或方法全部都使用 public  , 调用方可以任意修改属性和调用方法 , 这样会使代码变得不可控 , 属性可能被很多地方以不同的方式进行修改 , 代码难以维护 。而且不熟悉业务的开发人员如果随意改动了一些关键属性 , 可能引发严重的问题 。
从另一个方面来说 , 类的共有属性和方法暴露的越多 , 对于调用者来说就会越复杂 , 越容易出现问题 , 合理地进行封装 , 可以提高可读性、可维护性 , 减少出错 。
这时 , 你是不是可以想想 , 平时写代码时 , 属性、方法、类如果要让外部进行调用 , 都统一写上 public 了呢?
继承目前面向对象的语言基本都支持继承特性 , 只是语法上有些细微的差别 , 比如 C# 语言是使用冒号 , Java 语言使用 extends 关键字 。但都是标识 is-a 的关系 。
在 C# 中一个类可以继承多个接口 , 但只能继承一个父类 , 我们通常说的 C# 只支持单继承指的是 C# 只能继承一个父类 , 但在 C++ 、Python 等语言中类是可以继承多个类的 。
我们经常会跟开发人员讲 , 不要到处复制代码 , 代码要做到能够复用 , 发现同一个逻辑在两个不同的类中的时候 , 可以抽象出来一个父类 , 让这两个类继承这个父类 。这个思路没有问题 , 也确实能解决我们的实际问题 , 提升代码质量 。
但随着功能的增加 , 我们需要对类的属性和方法进行扩展 , 会发现需要新添加的属性或方法放在父类或子类都不合适 , 只能继续进行抽象 , 长此下去 , 继承关系会变得非常复杂 , 变得难以维护 。有条设计原则是这么说的:组合优于继承 , 其实就是为了解决这个问题 。

推荐阅读