• 欢迎访问搞代码网站,推荐使用最新版火狐浏览器和Chrome浏览器访问本网站!
  • 如果您觉得本站非常有看点,那么赶紧使用Ctrl+D 收藏搞代码吧

设计模式 – 在看深入php第8章设计原则遇到一些困惑

php 搞代码 4年前 (2022-01-25) 16次浏览 已收录 0个评论
文章目录[隐藏]

下面代码是书上例子,在php下运行也没错误,但有几点不解
1.abstract 抽象类 里面竟然没有抽象方法?
2. function __construct( $duration, CostStrategy $strategy ) {
还有这种传递方式?我仔细看了一下,应该是把下面声明的抽象类CostStrategy以别名方式传进来,是这样吗,如果是真的,抽象类CostStrategy都不需要被继承吗?
这段代码把我搞糊涂了

<code><?phpabstract class Lesson {    private   $duration;    private   $costStrategy;    function __construct( $duration, CostStrategy $strategy ) {        $this->duration = $duration;        $this->costStrategy = $strategy;    }    function cost() {        return $this->costStrategy->cost( $this );    }    function chargeType() {        return $this->costStrategy->chargeType( );    }    function getDuration() {        return $this->duration;    }    // more lesson methods...}abstract class CostStrategy {    abstract function cost( Lesson $lesson );    abstract function chargeType();}class TimedCostStrategy extends CostStrategy {    function cost( Lesson $lesson ) {        return ( $lesson->getDuration() * 5 );    }    function chargeType() {        return "hourly rate";    }}class FixedCostStrategy extends CostStrategy {    function cost( Lesson $lesson ) {        return 30;    }    function chargeType() {        return "fixed rate";    }}class Lecture extends Lesson {    // Lecture-specific implementations ...}class Seminar extends Lesson {    // Seminar-specific implementations ...}$lessons[] = new Seminar( 4, new TimedCostStrategy() );$lessons[] = new Lecture( 4, new FixedCostStrategy() );foreach ( $lessons as $lesson ) {    print "lesson charge {$lesson->cost()}. ";    print "Charge type: {$lesson->chargeType()}\n";}?></code>

回复内容:

下面代码是书上例子,在php下运行也没错误,但有几点不解
1.abstract 抽象类 里面竟然没有抽象方法?
2. function __construct( $duration, CostStrategy $strategy ) {
还有这种传递方式?我仔细看了一下,应该是把下面声明的抽象类CostStrategy以别名方式传进来,是这样吗,如果是真的,抽象类CostStrategy都不需要被继承吗?
这段代码把我搞糊涂了

<code><?phpabstract class Lesson {    private   $duration;    private   $costStrategy;    function __construct( $duration, CostStrategy $strategy ) {        $this->duration = $duration;        $this->costStrategy = $strategy;    }    function cost() {        return $this->costStrategy->cost( $this );    }    function chargeType() {        return $this->costStrategy->chargeType( ); <p style="color:transparent">2本文来源gao!daima.com搞$代!码网</p><span>搞代gaodaima码</span>   }    function getDuration() {        return $this->duration;    }    // more lesson methods...}abstract class CostStrategy {    abstract function cost( Lesson $lesson );    abstract function chargeType();}class TimedCostStrategy extends CostStrategy {    function cost( Lesson $lesson ) {        return ( $lesson->getDuration() * 5 );    }    function chargeType() {        return "hourly rate";    }}class FixedCostStrategy extends CostStrategy {    function cost( Lesson $lesson ) {        return 30;    }    function chargeType() {        return "fixed rate";    }}class Lecture extends Lesson {    // Lecture-specific implementations ...}class Seminar extends Lesson {    // Seminar-specific implementations ...}$lessons[] = new Seminar( 4, new TimedCostStrategy() );$lessons[] = new Lecture( 4, new FixedCostStrategy() );foreach ( $lessons as $lesson ) {    print "lesson charge {$lesson->cost()}. ";    print "Charge type: {$lesson->chargeType()}\n";}?></code>

function __construct( $duration, CostStrategy $strategy )
这行代码中的CostStrategy $strategy是指定了该参数的类型约束,必须是CostStrategy类或者其子类的对象

PHP类型约束:http://php.net/manual/zh/language.oop5.typehinting.php
至于抽象类里没有抽象方法,确实是可以这样的,官方文档里的解释要细细读一下比较绕
PHP 5 支持抽象类和抽象方法。定义为抽象的类不能被实例化。任何一个类,如果它里面至少有一个方法是被声明为抽象的,那么这个类就必须被声明为抽象的
就是说如果有抽象方法了那么这个类必须声明成抽象类,抽象方法是抽象类的必要条件,而抽象类不是抽象方法的充分条件, 不知这么解释是否清楚。
PHP 抽象类 : http://php.net/manual/zh/language.oop5.abstract.php

妹妹下面好痒,qq2850071112,有需要的来,满足你的要求,手机电脑都可以看的,视频一对一服务的,,http://www.301se.com


搞代码网(gaodaima.com)提供的所有资源部分来自互联网,如果有侵犯您的版权或其他权益,请说明详细缘由并提供版权或权益证明然后发送到邮箱[email protected],我们会在看到邮件的第一时间内为您处理,或直接联系QQ:872152909。本网站采用BY-NC-SA协议进行授权
转载请注明原文链接:设计模式 – 在看深入php第8章设计原则遇到一些困惑
喜欢 (0)
[搞代码]
分享 (0)
发表我的评论
取消评论

表情 贴图 加粗 删除线 居中 斜体 签到

Hi,您需要填写昵称和邮箱!

  • 昵称 (必填)
  • 邮箱 (必填)
  • 网址