[ Поиск ] - [ Пользователи ] - [ Календарь ]
Полная Версия: Factory Method
Dingo
У меня вопросы, сейчас же они связаны с теорией, а именно с шаблонами проектирования.
На данный момент я вник в суть двух шаблонов проектирования, а именно
  • Singleton
  • Strategy
Сейчас пришел к изучению фабрик. Сперва Factory Method.
Въехать вообще не могу, перечитал 2 раза, все равно въехать не могу sad.gif , может кто нибудь попроще объяснит, чем это делает Мэтт Зандстра, буду очень благодарен.



Спустя 1 час, 16 минут, 10 секунд (24.09.2010 - 19:15) ZSH написал(а):
Цитата
может кто нибудь попроще объяснит, чем это делает Мэтт Зандстра


вот этим

Спустя 46 минут, 35 секунд (24.09.2010 - 20:01) Dingo написал(а):
ZSH mad.gif
Цитата (Dingo @ 24.09.2010 - 14:58)
может кто нибудь попроще объяснит, чем это делает Мэтт Зандстра

вообще то Мэтт Зандстра один из авторов данной книги и именно ее я сейчас читаю, и именно там я не могу разобраться.

Спустя 2 часа, 57 минут, 10 секунд (24.09.2010 - 22:58) Dingo написал(а):
Ну что же, видимо на этом форуме мне уже делать нечего.... буду просить помощи в другом месте....

Спустя 50 минут, 33 секунды (24.09.2010 - 23:49) Ice написал(а):
всякая практика лучше любой теории.
Стандартный "школьный" образец:

abstract class User{

function __construct($name){
$this->name = $name;
}

function getName(){
return $this->name;
}

// Permission methods
function hasReadPermission(){
return true;
}

function hasModifyPermission(){
return false;
}

function hasDeletePermission(){
return false;
}

// Customization methods
function wantsFlashInterface(){
return true;
}

protected $name = NULL;
}

class GuestUser extends User {
}


class CustomerUser extends User {
function hasModifyPermission(){
return true;
}
}


class AdminUser extends User {
function hasModifyPermission(){
return true;
}

function hasDeletePermission(){
return true;
}

function wantsFlashInterface(){
return false;
}
}


class UserFactory {
private static $users = array("Andi"=>"admin", "Stig"=>"guest", "Derick"=>"customer");

static function Create($name){
if(!isset(self::$users[$name])){
// Error out because the user doesn't exist
}
switch(self::$users[$name]){
case "guest": return new GuestUser($name);
case "customer": return new CustomerUser($name);
case "admin": return new AdminUser($name);
default: // Error out because the user kind doesn't exist
}
}
}


function boolToStr($b){
if($b == true){
return "Yes\n";
}
else{
return "No\n";
}
}


function displayPermissions(User $obj){
print $obj->getName()."'s permissions:\n";
print "Read: ".boolToStr($obj->hasReadPermission());
print "Modify: ".boolToStr($obj->hasModifyPermission());
print "Delete: ".boolToStr($obj->hasDeletePermission());
}
function displayRequirements(User $obj){
if ($obj->wantsFlashInterface()) {
print $obj->getName()." requires Flash\n";
}
}


$logins = array("Andi", "Stig", "Derick");

foreach($logins as $login){
displayPermissions(UserFactory::Create($login));
displayRequirements(UserFactory::Create($login));
}

Спустя 3 минуты, 41 секунда (24.09.2010 - 23:52) Dingo написал(а):
Ice wink.gif Посмотрю.

Спустя 21 час, 6 минут, 57 секунд (25.09.2010 - 20:59) SlavaFr написал(а):
@ice если он с примерами и кодом не все понял, то просто одним кодом ему не помочь

Цитата (Dingo)
Ну что же, видимо на этом форуме мне уже делать нечего.... буду просить помощи в другом месте....

зачем же? на этом форуме тоже врачи имеются.

Если ты прочитал какуюто неудачную статью о Фабриках, то стоит просто почитать о них в другом месте. Многие писатили обладают талантом из простых вещей делать чтото сложное путем добавления кучи ненужных обяснений и диаграмм.

factory method или Фабрика это просто вспомогательное средство создавать новые объекты, тип которых известен во время протикания программы.

//тут я должен выдать object типа bmw
$bmw=Фабрикамашин::факториМетод("bmw");

//a тут object типа запарожец
$zapor=Фабрикамашин::факториМетод("таврия");

ВСЕ!!!!!
чтобы легко было обращатся с обектами которые фабрика отдает, не плохо было бы чтоб запарожец и bmw имели одинаковые мотоды типа старт(), стоп() чтоб можно было обращатся с этими обектами по одинаковому принципу. этого проще всего добится за щет того, что все объекты которые выдает фактори наследуют свои методы которые тебе нужны из общего класса или интерфейса.
ВСЕ ВСЕ!!!

Теперь еще раз посмотри на пример @Ice и найди описываемые особенности фбричного метода (factory method). Посмотри также другие примеры.
Если чтото непонятно, то просто задавай вопросы.

Спустя 2 часа, 9 минут, 14 секунд (25.09.2010 - 23:09) twin написал(а):
Цитата
Если чтото непонятно, то просто задавай вопросы.

Так и подмывает задать вопрос - а нафига? smile.gif

Я вот столкнулся с проблемой Dingo, только в плане пользы применения.
Как работает - понятно. Нахрена - полный мрак.

Очередная попытка заткнуть дырку ООП?

Спустя 7 минут, 39 секунд (25.09.2010 - 23:16) Mizka написал(а):
Цитата
Так и подмывает задать вопрос - а нафига? 

облегчает создание объектов и работу с ними когда у тебя большая иерархия классов.

Спустя 17 минут, 1 секунда (25.09.2010 - 23:33) Гость_Dingo написал(а):
SlavaFr Мы можем запросить запор, а получить BMW, в жизни бы так. laugh.gif

Спустя 3 минуты, 52 секунды (25.09.2010 - 23:37) Mizka написал(а):
вон самый простой пример с машинками:

class Bmw{

private $price = 999;

public function getPrice(){
return $this->price;
}
}


class Zapor{

private $price = 111;

public function getPrice(){
return $this->price;
}
}


class CarFactory{

public static function getCarInstance($carName){
if($carName = 'bmw'){
return new bmw();
}
if($carName = 'zapor'){
return new zapor();
}
}
}



и результат:
echo CarFactory::getCarInstance('bmw')->getPrice(); // 999


разве не упрощает жизнь?smile.gif

Спустя 13 часов, 50 минут, 1 секунда (26.09.2010 - 13:27) SlavaFr написал(а):
во, Mizka тоже правильный пример привел который блогодаря наплевательскому отношению php к типам прекрассно подходит. Изменив этот пример мы можем и к вопросу "Нафига" подойти и одновременно увидеть как это в других языках программирования работает.

в программе нам в конечном итоге надо с таваром работать.
товар->getPrice(); это то, что мы хотим применять на все объекты которые нам выдает Фабрика во время протикания программы.
Чтобы мы завтра могли работать с бубликами, то надо, чтоб и бублики имели метод getPrice. Чтоб навязать всем товарам этот метод самым ефективным способом это зделать интерфейс

interface iTovar
{
public function getPrice();
public function __constrict();//чтоб контруктор был без параметров
}

и зделать из машин товар посредством того что мы допишем
implements iTovar


error_reporting(E_ALL);
/**
* условие для использования в нашей программе
* ваш класс должен переписать интерфасе iTovar
*/

interface iTovar
{
/* @return float */
public function getPrice();
public function __construct();//чтоб контруктор был без параметров
}

###### классы пременяемые в фабрике #######
class Bmw implements iTovar{
private $price = 999;

public function __construct(){}

public function getPrice(){
return $this->price;
}
}


class Zapor implements iTovar{
private $price = 111;

public function __construct(){}

public function getPrice(){
return $this->price;
}
}

#############################

###### Фабрика машин

class CarFactory{

public static function getCarInstance($carName){
if($carName = 'bmw'){
return new bmw();
}
if($carName = 'zapor'){
return new zapor();
}
}
}




###############Фабрика Tovar ###############

/**
* Class TovarFactory
*/

class TovarFactory{
/**
*
* Фабрика для выдачи товара
*
@param $tovar : string
*
@return iTovar
*/

public static function FactoryMethod_getTovar($tovar){
$tov=new $tovar;
if(is_a($tov,'iTovar'))return $tov;
//
$tow=null;
throw new Exception( $tovar не товар!!!", 1);
}
}


##########Применение гдето в программе
$tovarmasiv=array('Bmw','DomDocument','Zapor');
foreach($tovarmasiv as $tovar_nazvanie){
try {

$t=TovarFactory::FactoryMethod_getTovar($tovar_nazvanie);
echo $tovar_nazvanie.':'.$t->getPrice().'<br />';
} catch (Exception $e) {
echo $e->getMessage();
}
}

exit;

Становится ясным, что Фабрика является надежным методом чтобы создовать объекты одного типа но разных классов. Посредством этой техники можно использовать в программе $t->getPrice не зависемо от того яцляется $т запорожцем или bmw и одновременно наязать другим в пренудительном виде программировать мной навязаные методы.
Фабрика часто используется в программировании plugin.

Спустя 6 часов, 38 минут, 2 секунды (26.09.2010 - 20:05) linker написал(а):
И так, буду бить по рукам больно.
abstract class User {}
Нет никакой необходимости в абстрактном классе.
Конструкции вида
function displayPermissions(User $obj) {}
принимают объекты класса User, но !!не!! GuestUser или AdminUser и прочих унаследованных классов от User. Конструкции вида
public static function getCarInstance($carName){
if($carName = 'bmw'){
return new bmw();
}
if($carName = 'zapor'){
return new zapor();
}
}
жутко ограниченные.
if(is_a($tov,'iTovar') {}
заменить на
if ($tov instanceof iTovar) {}
Но суть вообще не в этом, зачем создавать экземпляр класса, чтобы потом в случае ложного условия сделать ему unset()
public static function FactoryMethod_getTovar($tovar){
if($tov == 'iTovar'))
{
$tov = new $tovar;
return $tov;
}
throw new Exception( $tovar не товар!!!", 1);
}
И вообще самый глобальный грабль, под каждую машину создавать свой собственный класс, за это я ненавижу фабрики, а тем более если они написаны криво, ибо полностью рушат все принципы ООП.

Спустя 28 минут, 3 секунды (26.09.2010 - 20:33) Mizka написал(а):
Цитата
И так, буду бить по рукам больно.

ну давай smile.gif

1.
Цитата
Нет никакой необходимости в абстрактном классе.

почему? аргументируй... в нем может лежать часть логики как минимум... и гарантирует правильную структуру в иерархии классов. остальное в 2.

2.
Цитата
принимают объекты класса User, но !!не!! GuestUser или AdminUser и прочих унаследованных классов от User. Конструкции вида

с чего ты взял? если GuestUser и AdminUser наследуют абстрактный класс User то метод function displayPermissions(User $obj) {} без проблем может принимать все потомки этого класса... это и есть одно из свойств полиморфизма. собственно для чего и нужен абстрактный класс

3.
Цитата
public static function getCarInstance($carName){
    if($carName = 'bmw'){
        return new bmw();
    }
    if($carName = 'zapor'){
        return new zapor();
    }
}
жутко ограниченные.

ну тут смешно критиковать... it is just for example smile.gif выглядит как-бы сугубо что-бы придраться...

4.
Цитата
if(is_a($tov,'iTovar') {}
заменить на
if ($tov instanceof iTovar) {}


эти функции одинаковые... то что инстансОф появился позже не делает его чем-то лучше... разве что если учесть что is_a был в свое время как деприкейтед но сейчас функция опять актуальная.
Цитата

Но суть вообще не в этом, зачем создавать экземпляр класса, чтобы потом в случае ложного условия сделать ему unset()

ну тут поддерживаю тебя:)
Цитата
И вообще самый глобальный грабль, под каждую машину создавать свой собственный класс, за это я ненавижу фабрики, а тем более если они написаны криво, ибо полностью рушат все принципы ООП.
а тут подробнее... чем нарушают все принципы ООП?

Спустя 1 час, 20 минут, 41 секунда (26.09.2010 - 21:54) SlavaFr написал(а):
я применил в моем случае специально is_a вместо instanceof так как iTovar является интерфейсом, а оператора implementsof eще не придумали.
Цитата
под каждую машину создавать свой собственный класс, за это я ненавижу фабрики, а тем более если они написаны криво, ибо полностью рушат все принципы ООП
я применил вариант с interface, но обычно используется класс или абстрактный класс, как это зделал @ice с User и тогда какраз писанина конкретно сокращается.

Что касается создания и уничтожения объекта в случае если он не является iTovar (только в случае ошибки), абсолютно с тобой согласен. Просто не хотелось ввязыватся в Reflection. Также я нехотел поименно называть все классы в FactoryMethod_getTovar, что заставило бы нас при создании новых классов одновременно делать изменение в factory method. Хочется еще подметить, что factory method практически не пременяется в циклах как в моем примере, так как его суть состоит в том чтоб выбрать один вариант из многих возможных и создать всего один подходящий объект.

Спустя 1 час, 5 минут, 51 секунда (26.09.2010 - 23:00) Ice написал(а):
Цитата (linker @ 26.09.2010 - 21:05)
И так, буду бить по рукам больно.

свой вариант есть? Али тока руками махать умеем-с? biggrin.gif

Спустя 3 минуты, 57 секунд (26.09.2010 - 23:04) linker написал(а):
Mizka
1. Потому что абстракция не для этого, в данном случае достаточно просто написать
class User {}

2. Потому что достаточно взять и накидать данный код и попробовать исполнить, получится ошибка аля
Catchable fatal error: Argument 1 passed to ... must be an instance of User, instance of TAdmUser given ...

3. Даже примеры должны быть корректными.
4. То что было деприкейт, не факт, что таковым не станет таковым снова. instanceof более корректна.
5. Ну может не все, но большинство и плюс также теряется весь кайф в ООП.

SlavaFr
Не важно, instanceof работает и для интерфейсов. Можно было и через абстракцию
abstract class aTovar
{
abstract public function getPrice();
abstract public function __construct();
}
Может проще сказать фабричному методу что нужно создать, тогда количество вариантов уходит в бесконечность?

Спустя 13 минут, 7 секунд (26.09.2010 - 23:17) linker написал(а):
Ice

class TCore
{
...
public function apiCreateObject($ClassName, $Properties = array(), $Enveroment = null, $InStack = false)
{
if (!class_exists($ClassName)) die('Error : Class not exists.');
$Object = new $ClassName($Properties);
...

return $Object;
}
}


class TObject extends TService
{
...
public function __construct($Properties = array())
{
...
foreach($Properties as $PropertyName => $PropertyValue)
$this->$PropertyName = $PropertyValue;
}

public function __set($PropertyName, $PropertyValue)
{
$this->Properties[$PropertyName] = $PropertyValue;
}

public function __get($PropertyName)
{
return isset($this->Properties[$PropertyName]) ? $this->Properties[$PropertyName] : null;
}
}


class TUser extends TObject
{
}


$User = TCore::$Kernel->apiCreateObject('TUser', array('Login' => 'Vasya', 'Password' => '1234'));

Спустя 1 минута, 22 секунды (26.09.2010 - 23:18) Ice написал(а):
вот это другое дело, а то сразу по рукам бить. Ишь, распоясался

Спустя 39 минут, 2 секунды (26.09.2010 - 23:57) SlavaFr написал(а):
@linker прокоментируй свой последний код.

Спустя 10 минут, 46 секунд (27.09.2010 - 00:08) linker написал(а):
SlavaFr
А что конкретно не понятно? Есть "фабрика", есть метод, ему отдается имя класса создаваемого объекта, список значений полей. Все просто.

Спустя 1 час, 1 минута, 53 секунды (27.09.2010 - 01:10) SlavaFr написал(а):
Ну так и у других есть тоже фабрика, причем работающая. Мне не понятно что в ней особеного, что я должен из этого кода для себя подчеркнуть?

Спустя 2 часа, 9 минут, 7 секунд (27.09.2010 - 03:19) twin написал(а):
Какая дурь...

Спустя 5 часов, 37 минут, 51 секунда (27.09.2010 - 08:57) Mizka написал(а):
Цитата
2. Потому что достаточно взять и накидать данный код и попробовать исполнить, получится ошибка аля

не знаю что тут в ихних примерах, но если два класса расширяют абстрактный и написать метод someMethod(AbstractClassName $obj) то он будет прекрасно принимать объекты его потомков... вчера специально проверял... думал можт ещё один баг ООП в ПХП smile.gif мб с интерфейсом по другому будет smile.gif можешь попробовать если не влом и написать результат smile.gif

Цитата
1. Потому что абстракция не для этого, в данном случае достаточно просто написать
class User {}

тогда уже интерфейс... так как в данном случае абстрактный класс описывал сугубо структуру классов.
Цитата

5. Ну может не все, но большинство и плюс также теряется весь кайф в ООП.

сорри, но все ровно не пойму... что есть большинство? можно конкретный пример... почему теряется кайф в ООП? фабрика вообще один из самых популярных порождающих паттернов... который используют во многих языках программирования.. не думаю что это было бы если б он так ломал принципы ООП... я не говорю что ты не прав, просто каждое конструктивное мнение заслуживает внимания smile.gif вот и интересно smile.gif

Цитата
3. Даже примеры должны быть корректными.

скорее упрощенный smile.gif))


как-то хаотично ответил... понедельник... утро smile.gif

Спустя 21 минута, 18 секунд (27.09.2010 - 09:18) Mizka написал(а):
    public function apiCreateObject($ClassName, $Properties = array(), $Enveroment = null, $InStack = false)
{
if (!class_exists($ClassName)) die('Error : Class not exists.');
$Object = new $ClassName($Properties);
...

return $Object;
}

использование die в классе - моветон.

структура классов у тебя честно говоря непонятная...
что за класс TService?
что за проперти $Enveroment = null, $InStack = false в конструкторе?

class TUser extends TObject
{
}
если он задумывался как базовый то пустой класс тоже моветон... лучше уж интерфейс использовать что-бы задать структуру классов... класс изначально задуман что-бы нести какую-то реализацию, а не просто что-бы объекты являлись полиморфами...

$User = TCore::$Kernel->apiCreateObject('TUser', array('Login' => 'Vasya', 'Password' => '1234'));

а тут интересно... оно создаст $Kernel экземпляр класса TCore? или это просто неправильное обращение к статическому методу? ну т.е что за $Kernel? да и apiCreateObject() у тебя не статический smile.gif просто не встречал такой конструкции раньше smile.gif

примеры должны быть тоже корректными rolleyes.gif

Спустя 1 минута, 39 секунд (27.09.2010 - 09:20) Mizka написал(а):
Цитата
Какая дурь...

дискуссия smile.gif

Спустя 9 часов, 23 минуты, 23 секунды (27.09.2010 - 18:43) twin написал(а):
Да я про вообще...
Вот зачем нужен этот паттерн? По большому счету для того, чтобы как то разрулить сильную связанность кода, которая присуща исключительно ООП.
А так, как в веб приложениях связанность не просто зло, а зло абсолютное, приходится лепить на этот тришкин кафтан всякие вот такие глупости.

А потом, набрав полный рот гов умных терминов, разводить подобные дискуссии на ровном месте.

Сначала наделать себе проблем, потом решать их вот такими костылями, потом важничать - вот мол как я умею. smile.gif

Спустя 15 часов, 43 минуты, 45 секунд (28.09.2010 - 10:27) Mizka написал(а):
Цитата
По большому счету для того, чтобы как то разрулить сильную связанность кода, которая присуща исключительно ООП.

ну он служит просто для удобного интерфейса создания объектов... в тех случаях если на прямую создать объекты сложно, неудобно... на самом деле очень полезная штука. Вот возьми хоть мою работу по валидатору форм (жаль, что когда писал халявил - был бы тебе наглядный пример tongue.gif )... так бы тебе пришлось создавать самому экземпляр класса валидатора для каждого контрола, а так у тебя есть один интерфейс для работы с либой... разве не удобно? ну признай smile.gif

Спустя 35 минут, 13 секунд (28.09.2010 - 11:02) twin написал(а):
Да признать то несложно. Я не против, конечно так удобнее.
Однако ты не понял. Конечно, если ты сделал валидатор по такой архитектуре, он крайне неудобен. Выхода два -
1. Сделать фабрику.
2. Не делать такой архитектуры.

Первый момент подразумевает сначала сделать себе головняка, потом его разруливать с помощью заплаток, которые высокопарно назвали "шаблоны проектирования"

Второй никаких этих сложностей не имеет по определению.

Ведь большая часть паттернов призвана как то облегчить участь ООП программистов и хоть чуть чуть размотать этот клубок запутанного и связанного кода.

То есть повторюсь - сначала сами себе придумываем проблему, потом придумываем костыль, как её избежать.

Спустя 1 минута, 43 секунды (28.09.2010 - 11:04) Joker написал(а):
Цитата (twin @ 27.09.2010 - 20:43)
Вот зачем нужен этот паттерн? По большому счету для того, чтобы как то разрулить сильную связанность кода, которая присуща исключительно ООП.

не правда, если нормально строить ООП то не какой связанности нету, ну если конечно она не нужна)

Спустя 1 минута, 43 секунды (28.09.2010 - 11:06) Joker написал(а):
Цитата (twin @ 28.09.2010 - 13:02)
Ведь большая часть паттернов призвана как то облегчить участь ООП программистов и хоть чуть чуть размотать этот клубок запутанного и связанного кода.

опять не правда я ООП юзаю уже 2 месяца, оч удобно если все хорошо заранее спроектированно. намного проще чем модульное программирование, но хорошо спроектированное получается не у всех....

Спустя 2 часа, 47 минут, 54 секунды (28.09.2010 - 13:54) Mizka написал(а):
Цитата
Да признать то несложно. Я не против, конечно так удобнее.
Однако ты не понял. Конечно, если ты сделал валидатор по такой архитектуре, он крайне неудобен. Выхода два -
1. Сделать фабрику.
2. Не делать такой архитектуры.

Первый момент подразумевает сначала сделать себе головняка, потом его разруливать с помощью заплаток, которые высокопарно назвали "шаблоны проектирования"

стоп-стоп, суть этой темы было именно обсуждения паттерна проектирования, вот мы и увидели его "полезности", а это возвращение к "ООП против функционального программирования" smile.gif а это уже другая история... (хотя я б тут отстаивал сторону своего подхода, да лениво, лучше замнуть smile.gif )

к стать вы тогда звали друг друга на дуэль (с линкером кажется), а толку... много шума, а драки нету... вот и решили б все, по крайней мере для себя smile.gif

Спустя 3 минуты, 13 секунд (28.09.2010 - 13:57) Ice написал(а):
значит линкёр не принял вызов?

Спустя 4 минуты, 22 секунды (28.09.2010 - 14:01) twin написал(а):
Цитата
а это уже другая история

ну я же и написал, что "вообще". smile.gif

Не, новый холивар ни сил ни времени поднимать нет.
Прошу пардона, что опять встрял со своим брюзжанием.

Продолжайте, я с интересом послушаю.

Спустя 8 часов, 19 минут, 11 секунд (28.09.2010 - 22:20) linker написал(а):
SlavaFr
А я не говорю, что надо делать как я написал, я привел свой пример к тому, что нет необходимости строить в фабрике кучу условий в зависимости от переданных параметров.

Mizka
1. Понимаешь класс User содержит исключительно реализованные методы и ни одного абстрактного. Какой из этого следует вывод? Первое, абстракция не нужна; второе, интерфейсы только объявляют методы, требующие реализации; третье, достаточно просто class User {}. Никакой абстрактный класс никогда не описывает никаких структур классов.
2. PHP 5.3.0, PHP 5.3.3 - не работает, отдается ошибка или ты думаешь я по памяти написал текст этой ошибки?
5. Например наследование, полиморфизм, абстракции и прочее.

По поводу своего примера, ок, прокомментирую:
1. die() здесь сугубо моя вставка для данного поста, на самом деле в оригинале написано иначе.
2. Нужна структура?
TCore
TLdlm -> TService -> TObject -> любой иной класс
для примера реализации контейнеров

TMySqlServer TCsv TVcf
\ | /
TLdlm -> TService -> TObject -> TList -> TContainer -> TXml
| \
TMySqlDatabase TMySqlTable
3. Загляни в реализацию класса TObject там написано, что за проперти.
4. $Enveroment и $InStack - к делу не относятся.
5. Класс TUser пустой потому что это пример, пустой класс вполне корректен, тем более что он наследник TObject, а значит имеет все, что имеет родитель.
6. Обрати внимание на множественные многоточия, говорящие о том, что здесь пропущен код. TCore - синглтон, экземпляр которого создается один раз.
7. TCore::$Kernel - в силу ряда причин мне нужен именно объект ядра, к которому я всегда и везде смогу обратиться без использования всяких глобальных переменных и прочих извратов.
8. Читайте доку на мой Framework smile.gif и все станет понятно.

Еще примерчик в угоду twin'а, как оно удобно
$User = TCore::$Kernel->apiCreateObject('TUser', $Container->apiView("SELECT * FROM `Users` WHERE `Id` = '1'"));




Спустя 10 часов, 21 минута, 37 секунд (29.09.2010 - 08:42) Mizka написал(а):
Цитата
1. Понимаешь класс User содержит исключительно реализованные методы и ни одного абстрактного. Какой из этого следует вывод? Первое, абстракция не нужна; второе, интерфейсы только объявляют методы, требующие реализации; третье, достаточно просто class User {}. Никакой абстрактный класс никогда не описывает никаких структур классов.

класс должен нести в себе реализацию, а не быть пустым. А что-бы просто объекты являлись полиморфами и служат абстрактные классы и интерфейсы. По крайней мере более корректно чем просто пустой базовый обычный класс.

Цитата
2. PHP 5.3.0, PHP 5.3.3 - не работает, отдается ошибка или ты думаешь я по памяти написал текст этой ошибки?

не знаю почему не работает... я вон ещё раз на работе проверил специально... на PHP 5.3.2. вон пример в 10 строчках smile.gif


abstract class Base{

abstract function getValue();
}

class First extends Base{

public function getValue(){
echo 111;
}
}


class Second extends Base{

public function getValue(){
echo 222;
}
}


class Test{

public function invoke(Base $obj){
$obj->getValue();
}
}



собственно и результат:

$test = new Test();
$test->invoke(new First()); //111
$test->invoke(new Second()); //222

если бы не работало это как раз и ломало бы одно из основных понятий ООП такое как полиморфизм.

об остальном дальше спорить лениво smile.gif

Спустя 26 минут, 51 секунда (29.09.2010 - 09:09) linker написал(а):
Mizka
Должен, но не обязан. Абстракция и интерфейсы не отвечают за полиморфизм как таковой, они обязывают и гарантируют реализацию абстрактных и интерфейсных методов, соответственно. В классе User нет ни одного абстрактного метода, а следовательно нет никакой необходимости объявлять его абстрактным. Плюс, не забываем, что не было никакой необходимости что-либо реализовывать внутри класса - лень и много букв для примера. Не там вы цепляетесь за корректность.

Не работает, вот хоть тресни.

Спустя 17 минут, 38 секунд (29.09.2010 - 09:26) Mizka написал(а):
Цитата
Не работает, вот хоть тресни.

это у тебя наверно какая-то проблема с интерпретатором... не понимаю как может не работать. можно ещё кого-то попросить потестить что-бы убедится smile.gif хотя у меня и дома и на работе работает на ура...
Быстрый ответ:

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