Я новичок в ООП.Я пытаюсь сохранить твердые принципы.Есть несколько вопросов.Это мой кодЕсть ли способ доступа к class FileManager
методам в class GenericUploader
(используйте абстрактный класс, потому что я могу предоставить некоторые базовые функции), когда я передаю в качестве зависимости class Image()
, class Video()
или что-то еще в UploaderClient?Цель всегда состоит в том, чтобы иметь доступ к class FileManager
методам, нет метра, если я передаю в качестве изображения зависимости, видео или файлового менеджера?
interface IFile
{
public function crete(array $data);
}
interface IFileManager extends IFile
{
public function exist(int $id);
}
class FileManager implements IFileManager
{
public function crete(array $data)
{
// store in DB files
}
public function exist()
{
}
}
class Image implements IFile
{
public function crete(array $data)
{
//access to FileManager
// store in DB image and files
}
}
abstract class GenericUploader
{
public $service;
public function __construct(IFile $service)
{
$this->service = $service;
}
public function upload()
{
//access to FileManager if $service is new Image()
}
}
class ImageUploader extends GenericUploader
{
public function __construct(IFile $service)
{
parent::__construct($service);
}
}
class FileManagerUploader extends GenericUploader
{
public function __construct(IFile $service)
{
parent::__construct($service);
}
}
class UploaderClient
{
public function uploadFile(IFile $service)
{
$name = get_class($service);
$uploaderClass = $name . 'Uploader';
if (class_exists($uploaderClass)) {
$uploader = new $uploaderClass($service);
$uploader->upload();
}
}
}
$client = new UploaderClient();
$client->uploadFile(new Image());
$client->uploadFile(new FileManager());
Обновление : если я расширяю Image, например
class Image extends FileManager implements IFile
{
public function crete(array $data)
{
//access to FileManager
// store in DB image and files
}
}
Неправильно ли получить доступ к методам класса FileManage таким способом ($ this-> service-> exist) из GenericUploader?Это нарушает принципы открытия / закрытия?