组合和继承的选择是一种权衡和选择 , 当涉及的类经常变化可能导致继承层级向着复杂化演化时 , 需要考虑采用组合的方式 , 如果相关类比较稳定 , 继承层级不深(一般不超过 3 层) , 就可以放心使用继承 。
在具体的模式中 , 组合模式、策略模式等就是使用组合的方式实现 , 模板模式使用的是继承方式实现 。
多态多态的字面意思就是同样的一个语法调用 , 能够表达多个不同的意思 。如果说继承的最大好处是复用 , 那么多态的好处就是方便扩展 。
在 C# 语言中两个比较典型的多态场景就是方法的重写和方法的重载:
- 重写:存在继承关系的类或接口 , 在子类中对父类的方法进行重新构建逻辑 , 但调用方法、参数、返回值保持一致 , 通常有下面几种情况: 普通的父类中有用 virtual 关键字标识的虚方法 , 在子类中使用 override 关键字进行重写;子类对抽象类的抽象方法进行重写;子类对接口中的方法进行实现 。
- 重载:类中的多个方法 , 方法名相同 , 但参数个数或类型不相同 , 称之为重载方法 。例如 C# 中的 File 类的 Open 方法就有三个重载 , 如下图:
![面向对象方法的基本思想 面向对象设计思想是什么](http://pic.yunnanlong.com/220914/0532106432-0.png)
方法的重写 , 在实际应用中非常常见 , 比如零代码平台中的消息组件会有多种发送消息的方式 , 下面用一个示例代码演示下:
public interface IMessage{void Send(string msg);}public class EmailMessage : IMessage{public void Send(string msg){Console.WriteLine($"send email message {msg}");}}public class WechatMessage : IMessage{public void Send(string msg){Console.WriteLine($"send wechat message {msg}");}}class Program{static void Main(string[] args){List<IMessage> messageList = new List<IMessage>();messageList.Add(new EmailMessage());messageList.Add(new WechatMessage());messageList.ForEach(s=>s.Send("test message"));}}
为什么说能提高扩展性呢?如果这时消息组件需要扩展发送短信的消息种类 , 只需要编写短信类型的消息类实现 IMessage 接口的 Send 方法即可 。还有一种场景 , 比如登陆的时候 , 有基于用户名密码的认证、企业微信的认证、钉钉的认证、和对接第三方的认证 , 又应该怎么设计呢?
【面向对象方法的基本思想 面向对象设计思想是什么】我们虽然都在使用着面向对象的语言 , 但很多的时候思维还是面向过程的 , 具体体现在:
- 实体类的属性直接定义为 public , set 和 get 都安排上 , 外部可以任意获取和赋值 , 很多时候使用代码生产工具直接生产实体类 , 默认的 set 和 get 都是 public , 也没有去依据具体的业务进行修改 , 严重破坏了封装特性;
- 数据和行为的分离 , 也就是所谓的贫血模式 , 但真正的对象是数据行为在一起的 , 我们可能每天都在写这样的代码 , 一种面向过程式的代码;
- 为了代码复用 , 代码中会存在大量的 Helper 类或者 Utils、Common 类 , 这些类通常是静态类 , 里面有各种各样的静态方法 , 在往里面添加方法时需要思考下 , 真的需要放到这里吗?
- 按照功能驱动 , 比如页面上的一个按钮操作 , 对应了一个 API 接口 , 不管你的代码时如何设计和分层 , 一层层往下知道数据库访问 。
推荐阅读
- 300m无线宽带路由器设置方法 如何拨号上网连接
- 大数据码获取方法 目前开源免费数据库有哪些
- 电脑蓝屏正确修复方法 电脑开机后蓝屏怎么办
- 青椒皮蛋制作方法
- 电脑开不了机最简单的解决方法 主机启动不起来怎么回事
- linux联网最简单方法 linux如何查看端口号及其状态
- 打印机喷头堵塞解决方法 彩色打印机如何清洗喷头
- 辐射76怎么安装MOD 安装MOD方法介绍
- 辐射76工房怎么使用 工房使用方法介绍
- 2345安全卫士卸载方法 怎么卸载2345安全卫士