Как избавится от дублирования кода? Сразу код:class CommonClass { public function foo() {/*...*/} public function bar() {/*...*/} } class ConcreteClass1 extends CommonClass { public function doSomething1() {/*...*/} public function doSomething2() {/*...*/} } class ConcreteClass2 { public function doSomething1() {/* тот же код из ConcreteClass1 */} public function doSomething2() {/* тот же код из ConcreteClass1 */} public function doSomething3() {/*...*/} } В реализации ConcreteClass2 присутсвуют два метода, которые полностью дублируют код методов из ConcreteClass1. При этом наследоваться от ConcreteClass1 нельзя, потому в ConcreteClass2 методы foo() и bar() из CommonClass не должны быть. Как можно избавиться от дублирования без множественного наследования и трейтов?
Один из способов избавиться от дублирования кода в данном случае - это использовать композицию. Мы можем вынести общий функционал в отдельный класс и использовать его в обоих ConcreteClass1 и ConcreteClass2.
Пример:
class CommonClass { public function foo() {/*...*/} public function bar() {/*...*/} } class ConcreteClass1 extends CommonClass { private $common; public function __construct() { $this->common = new CommonClass(); } public function doSomething1() {/*...*/} public function doSomething2() {/*...*/} } class ConcreteClass2 { private $common; public function __construct() { $this->common = new CommonClass(); } public function doSomething1() { $this->common->foo(); $this->common->bar(); /* тот же код из ConcreteClass1 */ } public function doSomething2() { $this->common->foo(); $this->common->bar(); /* тот же код из ConcreteClass1 */ } public function doSomething3() {/*...*/} }
Таким образом, общий код foo() и bar() из CommonClass используется через композицию в обоих ConcreteClass1 и ConcreteClass2, избегая дублирования кода.
Один из способов избавиться от дублирования кода в данном случае - это использовать композицию. Мы можем вынести общий функционал в отдельный класс и использовать его в обоих ConcreteClass1 и ConcreteClass2.
Пример:
class CommonClass {public function foo() {/*...*/}
public function bar() {/*...*/}
}
class ConcreteClass1 extends CommonClass {
private $common;
public function __construct() {
$this->common = new CommonClass();
}
public function doSomething1() {/*...*/}
public function doSomething2() {/*...*/}
}
class ConcreteClass2 {
private $common;
public function __construct() {
$this->common = new CommonClass();
}
public function doSomething1() {
$this->common->foo();
$this->common->bar();
/* тот же код из ConcreteClass1 */
}
public function doSomething2() {
$this->common->foo();
$this->common->bar();
/* тот же код из ConcreteClass1 */
}
public function doSomething3() {/*...*/}
}
Таким образом, общий код foo() и bar() из CommonClass используется через композицию в обоих ConcreteClass1 и ConcreteClass2, избегая дублирования кода.