面向对象 *** 的基本思想 面向对象设计思想是什么( 二 )

  • 重载:类中的多个 ***  ,  *** 名相同 , 但参数个数或类型不相同 , 称之为重载 ***。例如 C# 中的 File 类的 Open*** 就有三个重载 , 如下图:
  • *** 的重写 , 在实际应用中非常常见 , 比如零代码平台中的消息组件会有多种发送消息的方式 , 下面用一个示例代码演示下:
    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 messageList = new List();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 接口 , 不管你的代码时如何设计和分层 , 一层层往下知道数据库访问 。
    所以不要以为使用了面向对象的语言就是在使用面向对象编程 , 重要的是抽象的思维 , 这种抽象需要我们去思考 , 去全盘考虑 , 相比较面向过程显得更难 , 所以懒惰的程序员更容易写出面向过程的代码 。
    这些面向对象的基础知识是学习设计模式的根基 , 掌握基础知识 , 然后愿意去思考 , 总结才能够学习好设计模式 , 并将其应用到实际的工作中 。下一篇将介绍面向对象中的常用设计原则 , 设计模式也都是基于这些设计原则演化而来 。


    推荐阅读