[ Поиск ] - [ Пользователи ] - [ Календарь ]
Полная Версия: protected constructor в синглтоне?
moreo
Здравствуйте!

Мне необходимео от какого-то класса A насследоавть класс B, причем класс B надо сделать синглтоном. Проблема в том, что по ученному в синглтоне констркутор должен быть private, но в таком случае не получится унаследовать
класс A с конструктором public, с другой стороны я не могу сделать конструктор класса A private так как от него могут наследоваться другие классы (не синглтоны). Мне пришла в голову идея, сделать конструктор класса A protected,
в таком случае в наследниках НЕ-синглтонах конструкртоы можно переписать как public, а в наследнике-синглтоне оставить protected чтобы была гарантия невозможности создания класса из вне. Но на каком-то форуме читал, что protected конструктор в синглтоне - очень плохо, почему, если с конструктором protected невозможно создать новукю копию объекта из вне ?


class A{
protected function __construct(){

}


class B extends A{

private static $instance = null;

public static function getInstance(){

if(self::$instance === null){
self::$instance = new self();
}
$inst = self::$instance;
return $inst;
}

private function __clone(){

}


protected function __construct(){


}
}
Michael
Цитата (moreo)
почему, если с конструктором protected невозможно создать новукю копию объекта из вне ?

Возможно. Эту копию можно создать из класса наследника:
class A1{
protected function __construct(){
print 'A1 created';
}
}


class A2 extends A1{
public function __construct(){
print 'A2 created';
$y = new A1();
}
}


$x = new A2();

// Выведет: A2 createdA1 created



_____________
There never was a struggle in the soul of a good man that was not hard
moreo
Ну впринципе да, спасибо Michael, а как можно сделать это грамотно, наследовать класс и сделать наследник синглтоном?
SlavaFr
Цитата (moreo @ 7.02.2013 - 17:10)
а как можно сделать это грамотно, наследовать класс и сделать наследник синглтоном?

Не наследавать вообще, а сделать компосицию или делегировать. Если нужно, чтоб 2й объект был с первым одного типа, то использовать intrerface.

Гдето так:

<?php
interface
Macker {
public function doIt();
public function doOther();
}

/**
* реализация Macker
*/

class Aclass implements Macker {
public function __construct()
{
echo __CLASS__ . '::' . __METHOD__ . "();\n";
}

public function doIt()
{
echo __CLASS__ . '::' . __METHOD__ . "();\n";
}

public function doOther()
{
echo __CLASS__ . '::' . __METHOD__ . "();\n";
}
}



/**
* Singelton типа Macker
*/

class BclassDelegateAclassSingelton implements Macker {

private $delegateAclass = null;

private static $instance = null;

private function __construct()
{
$this->delegateAclass = new Aclass;
echo __CLASS__ . '::' . __METHOD__ . "();\n";
}

//делигировать без изменений
public function doIt()
{
$this->delegateAclass->doIt();
}

//делигировать изменяя поведение
public function doOther()
{
echo __CLASS__ . '::' . __METHOD__ . "();\n";
}

public static function getInstance()
{
if (is_null(self::$instance)) {
self::$instance = new self();
}

return self::$instance;
}

private function __clone()
{
}
}


echo "Test Aclass \n";
$Macker1 = new Aclass;
$Macker1->doIt();
$Macker1->doOther();


echo "\n\nТест Singelton с частично измененным поведением класса Aclass \n";
$Macker2 = BclassDelegateAclassSingelton::getInstance();
$Macker2->doIt();
$Macker2->doOther();


_____________
↓↓↓↓↓↓↓↓↓↓
ответ может быть здесь
или в mysql_error();
Быстрый ответ:

 Графические смайлики |  Показывать подпись
Здесь расположена полная версия этой страницы.
Invision Power Board © 2001-2025 Invision Power Services, Inc.