为了账号安全,请及时绑定邮箱和手机立即绑定

一个关于面向对象的问题

一个关于面向对象的问题

PHP
慕姐8265434 2019-03-15 17:14:32
大家好,问个问题:设计模式中一个抽象类被多个类继承 比如:'充值抽象类' 被'打折类','充值返现类'继承,这样面向接口编程 比 直接在一个公共类中提供 '打折方法' 和 '充值返现方法' 的好处是什么?
查看完整描述

2 回答

?
料青山看我应如是

TA贡献1772条经验 获得超8个赞

都可以达到代码的复用。说白了,就是继承和组合的区别。优缺点自己搜索下。
实际中根据实际情况取舍,一般来说建议多使用组合,因为继承的结构是静态的,而组合的动态的。

查看完整回答
反对 回复 2019-03-15
?
冉冉说

TA贡献1877条经验 获得超1个赞

理解面向对象

事实上,如果按照面向对象来理解,这个公共类在你代码中的位置是非常模糊的,你首先需要回答我,公共类是哪些对象的抽象?(其实会出现公共类一说,基本上都是用框架的后遗症)

比如说
我现在有

  • "会飞的鸭子"

  • "橡皮材质的鸭子"

  • "石头雕刻的鸭子"

那么前面这些,我能抽象出一个所谓的"鸭子类",这才是"面向对象",而你这边所谓的公共类里拥有"打折方法","充值方法",我暂时无法想到你是怎样进行抽象的,才能让这样一个抽象类中同时拥有这两个方法的

设计模式中为什么需要面向接口编程

我理解的为什么需要设计模式

设计模式是长期实践中,前人总结出来的代码的一些写法,不玩设计模式,代码很难做到高内聚低耦合,敏捷开发下会被玩死

面向接口的好处

这个基本上看看策略模式你就能感觉出来了

我这里稍微举例一下

按照公共类来写

使用伪代码

class 公共类 {
    function 打折方法();
    function 充值返现方法();
}class 继承类1 extends 公共类 {
    function 打折方法();
}class 继承类2 extends 继承类1 {
    function 打折方法();
}//使用继承类1//使用继承类2

那么现在,我突然有新的需求,我被迫修改的是公共类,那么我继承类1和继承类2都需要改,因为继承类中会有多余的方法,这既不是面向对象,同时这也是很致命的,每次改公共类都会影响到继承类,会出现很多隐患

看看面向接口编程

interface 充值接口 {    function 充值方法();
}//这个只是按照你的思路写,具体这个规定这个接口应不应该实现底下的两个类还有待商榷class 打折类 implements {    function 充值方法(){    //必须实现接口的方法
        //具体实现打折
    }
}class 充值返现类 implements {    function 充值方法(){        //具体充值返现
    }
}class 类1 {    public $返现;    function __construct(){        //这样写其实还是要改代码的,其实不是策略模式,就是现在这样写够理解就行
        $this->返现 = new 充值返现类;
    }    
    function 返现() {        $this->返现->充值方法();
    }
}class 类2 {    public $打折;    function __construct(){        //这样写其实还是要改代码的,其实不是策略模式,就是现在这样写够理解就行
        $this->打折 = new 打折类;
    }    
    function 打折() {        $this->打折->充值方法();
    }
}
这样,当我需要一个新的和充值有关的,我只需要实现充值接口,就不会影响到原先的类

这样简单写一下,你不一定能理解,还是建议看一下设计模式的策略模式,会比较容易理解


查看完整回答
反对 回复 2019-03-15
  • 2 回答
  • 0 关注
  • 495 浏览

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信