Что правильнее использовать для множественного наследования в следующем случае? Второй метод соответствует принципу SOLID правильно? Или вместо этого можно использовать любой общий шаблон дизайна?
Это упрощенный концептуальный код. Многие классы должны расширять класс Image, как BicycleImage, BusImage. Некоторые из них должны добавить addNoise (), но не каждый. Кроме того, необходимы дополнительные классы с изменением состояния, такие как sharpenEdges, IncreaseIntesity и т. Д., Которые не каждый дочерний класс использует.
Базовый класс:
<?php
abstract class Image
{
private $pixels;
public function setPixel(int $x, int $y, int $intensity): void
{
$this->pixels[$x][$y] = $intensity;
}
public function saveImage(): void {}
}
Метод черты:
trait RandomNoiseTrait
{
public function addNoise(): void
{
$this->setPixel(mt_rand(1, 100), mt_rand(1, 100), mt_rand(1, 100));
}
}
class CarImage extends Image
{
use RandomNoiseTrait;
public function drawCar(): void {}
}
$carImage = new CarImage();
$carImage->drawCar();
$carImage->addNoise();
$carImage->saveImage();
Объект, внедренный в отдельный объект, который изменяет состояние внедренных объектов:
class CarImage extends Image
{
public function drawCar(): void {}
}
class RandomNoise
{
private $image;
public function __construct(Image $image)
{
$this->image = $image;
}
public function addNoise(): void
{
$this->image->setPixel(mt_rand(1, 100), mt_rand(1, 100), mt_rand(1, 100));
}
}
$carImage = new CarImage();
$carImage->drawCar();
$noise = new RandomNoise($carImage);
$noise->addNoise();
$carImage->saveImage();