Maison >développement back-end >tutoriel php >设计模式 - 在看深入php第8章设计原则遇到一些困惑
下面代码是书上例子,在php下运行也没错误,但有几点不解
1.abstract 抽象类 里面竟然没有抽象方法?
2. function __construct( $duration, CostStrategy $strategy ) {
还有这种传递方式?我仔细看了一下,应该是把下面声明的抽象类CostStrategy以别名方式传进来,是这样吗,如果是真的,抽象类CostStrategy都不需要被继承吗?
这段代码把我搞糊涂了
<code><?php abstract 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><?php abstract 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>
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