• 面向对象——浅谈弊端


    转自知乎

    我个人觉得很有用 我就将其转载过来,大家有兴趣可以看下。

    没有人还记得面向对象原本要解决的问题是什么,这就是我们现在所面临的困境。

    面向对象原本要解决什么(或者说有什么优良特性)
    似乎很简单,但实际又很不简单:面向对象三要素封装、继承、多态

    封装:封装的意义,在于明确标识出允许外部使用的所有成员函数和数据项,或者叫接口。

    继承+多态:继承和多态必须一起说。一旦割裂,就说明理解上已经误入歧途了。

    先说继承:继承同时具有两种含义:其一是继承基类的方法,并做出自己的改变和/或扩展——号称解决了代码重用问题;其二是声明某个子类兼容于某基类(或者说,接口上完全兼容于基类),外部调用者可无需关注其差别(内部机制会自动把请求派发[dispatch]到合适的逻辑)。

    再说多态:基于对象所属类的不同,外部对同一个方法的调用,实际执行的逻辑不同。

    很显然,多态实际上是依附于继承的两种含义的:“改变”和“扩展”本身就意味着必须有机制去自动选用你改变/扩展过的版本,故无多态,则两种含义就不可能实现。
    继承的第二种含义非常重要。它又叫“接口继承”。
    接口继承实质上是要求“做出一个良好的抽象,这个抽象规定了一个兼容接口,使得外部调用者无需关心具体细节,可一视同仁的处理实现了特定接口的所有对象”——这在程序设计上,叫做归一化。
    真正的封装是,经过深入的思考,做出良好的抽象,给出“完整且最小”的接口,并使得内部细节可以对外透明(注意:对外透明的意思是外部调用者可以顺利的得到自己想要的任何功能,完全意识不到内部细节的存在;而不是外部调用者为了完成某个功能、却被碍手碍脚的private声明弄得火冒三丈;最终只能通过怪异、复杂甚至奇葩的机制,才能更改他必须关注的细节——而且这种访问往往被实现的如此复杂,以至于稍不注意就会酿成大祸)。




  • 相关阅读:
    (原创,呕心历血之作,强烈推荐)新旧库数据字典比较脚本
    MS SQL Server2k字符串分拆与合并处理代码
    20061021个人日志(关于在VS2005环境下无法从源视图切换到设计视图的解决方案)
    我设计的花销流水帐的数据库结构 荣
    Oracle中创建表,创建序列,创建自增字段,添加注释, 添加记录,添加触发器,提交 荣
    用例与用例描述 荣
    计算经纬度距离 荣
    我的第一个C++程序 荣
    以较少代码实现DataGrid的排序,翻页,删除等功能(续) 荣
    我的BREW代码 荣
  • 原文地址:https://www.cnblogs.com/cgdblog/p/7190259.html
Copyright © 2020-2023  润新知