абстракция или интерфкйс

itprog

Cruftsman
это пример "один из описания синтаксиса" :)

самый банальный пример - абстракция доступа к бд :)
 
ну и там еще добавить можно:
PHP:
	function someAction(AccessOne $impl)
	{
		...
	}
	
	function someAction2(AccessTwo $impl)
	{
		...
	}
	
	$uni = new AccessImpl1();
	someAction($uni);
	someAction2($uni);
но это все равно, очень частный случай...
 
Curly-fingers
а говоришь два раза :p
а врать нехорошо..

-~{}~ 13.08.07 15:09:

itprog
ээээ, это к interface или к abstract class?
 

itprog

Cruftsman
Curly-fingers
вообще в мануале очень хорошо описано различие, надо вдуматься в каждое слово, их там не много.
 

whirlwind

TDD infected, paranoid
Интерфейсы позволяют более четко разграничивать обязанности. Например:

PHP:
interface IActionValidator {
    function validateAction(IMarsProtoAction $action);
}

interface PaymentSystemOperator {
   function payout(PayoutRequest $request);
   function testInvoice(PayoutRequest $request);
}
те кто имплементируют эти методы могут быть в виде одного или двух классов, в зависимости от необходимости. А тем, кто используют классы с этими интерфейсы абсолютно по барабану, что там имплементируется кроме того, что требуется для работы. Главное - они могут затребовать тот интерфейс, который им нужен.

PHP:
class RegisterExchangeActionHandle implements IMarsProtoActionHandle {

    public function execute(IMarsProtoAction $action){
        $action = new RegisterExchangeAction($action);
        if ( ($result = System::getInstance()->getPaymentSystemFactory()
            ->validateAction($action)) !== null )
        {
            return $result;
        }

        $payout = ...

        $result = new RegisterExchangeResult();
        $result->sayApproved();
        return $result;
    }
    
}

class PayoutProcessor {
    
    public function run($callbackUrl){
        $request = $this->_getPayoutRequests();
        $factory = System::getInstance()->getPaymentSystemFactory();
        while ( $request->next() ){
            $skip = false;
            try {
                $inPaymentSys = $factory->get($request->in_currency);
                $outPaymentSys = $factory->get($request->out_currency);
            }catch( Exception $e ){
                $request->status = PayoutRequest::STATUS_ERROR;
                $skip = true;
            }
            if ( !$skip ){
                if ( $inPaymentSys->testInvoice($request) ){
                    $request->status = $outPaymentSys->payout($request) ?
                        PayoutRequest::STATUS_COMPLETED :
                        PayoutRequest::STATUS_DECLINED;
                }else{
                    $request->status = PayoutRequest::STATUS_QUEUE;
                }
            }
            $request->save();
        }
        
        $balanceController = new AccountBalanceController();
        $balanceController->run($callbackUrl);
    }
}
В конечном итоге не важно что мы реализуем в классе. Абстрактный класс это почти реализация. Интерфейс - это далеко не реализация.
 

dark-demon

d(^-^)b
>Не понимаю отличия абстрактных и интерфейсов.
названия разные - вот и всё отличие. всё остальное - либо домыслы, либо особенности конкретной реализации.
 

whirlwind

TDD infected, paranoid
dark-demon - не совсем, интерфейсы пхп - это половина множественного наследования. Имплементировать можно сколько угодно интерфейсов, но наследовать только один класс.
 
если это единственное отличие, которое описал whirlwind, тогда я начинаю понимать. наконец-то.
имхо в мануале оч. мутно написано, кроме того почитал много всякой лабуды на эту тему и нигде не мог понять.
теперь вроде ясно.
начинаю думать о предложении mishco в первых постах этого топика :)
Спасибо.
 
Curly-fingers
Что значит "единственное"? Практики обилие и работа над собой понять эникею дао интерфейсов и абстрактных классов помогут :).
 
Сверху