У меня был очень длинный класс «Плейлист»; наличие функций, которые, помимо прочего, обрабатывали бы кеш списка воспроизведения, переменные и пресеты.
class Playlist{
var $cache;
var $variables;
var $preset;
function __construct(){
$this->cache = populate_cache();
$this->variables = $this->populate_variables();
$this->preset = $this->populate_preset();
}
function populate_cache(){
}
function populate_variables(){
}
function populate_preset(){
}
}
Поскольку читать стало очень трудно (много функций для вещей, связанных с кешем, переменными, пресетами), я начал разбивать их на несколько классов (код здесь сокращен):
class Playlist{
var $cache;
var $variables;
var $presets;
function __construct(){
$this->cache = new PlaylistCache($this);
$this->variables = new PlaylistVariables($this);
$this->presets = new PlaylistPreset($this);
}
}
class PlaylistCache{
var $playlist;
function __construct(&$playlist){
$this->playlist = $playlist;
}
}
class PlaylistVariables{
var $playlist;
function __construct(&$playlist){
$this->playlist = $playlist;
}
}
class PlaylistPreset{
var $playlist;
function __construct(&$playlist){
$this->playlist = $playlist;
}
}
Таким образом, объект Playlist передается каждому «подклассу». Если я хорошо понял, это называется Внедрение зависимости. Я не уверен, что это очень умно, так как
НО мне нужно иметь доступ ко всему объекту Playlist через каждый подкласс, и это единственный способ, который я нашел на данный момент.
Я уже знаю о расширение классов, но я не хочу расширять свой класс здесь: кеш, переменные и пресеты — это не другой вид списка воспроизведения, это «свойства», которые должен заполнять мой список воспроизведения.
Я немного вырыл и прочитал о Абстрактные классы, Черты, Интерфейсы, и я думаю, что мое решение где-то в этом. Но я не могу найти где, и мне довольно трудно понять, потому что это действительно абстрактно, и английский не мой родной язык.
Итак: кто-нибудь понимает, что я имею в виду и есть предложения?
Спасибо !
Некоторые комментарии вводят в заблуждение. «Дочерние» классы используют внедрение зависимостей, а не наследование родительских / дочерних отношений. Однако, класс playlist (родительский) использует композицию.
&в конструкторы составляютпередача по ссылке». Чтобы передать по значению, класс должен методы доступа. Если вам нужен только один экземпляр скажем … текущий плейлист, одиночка имеет смысл. Черты являются решением для вставки копий — дизайн для шаблона синглтона может быть размещен в виде черты, но использование синглтона не будет.
Подумайте, что классы списка воспроизведения * действительно нужны из списка воспроизведения, и рассмотрите возможность передачи этих значений явно.
Других решений пока нет …