Re: A Good OOP Tutorial/Read?

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

 



On Fri, May 17, 2013 at 7:04 AM, Tedd Sperling <tedd.sperling@xxxxxxxxx>wrote:

> To me there is no difference between an abstract class (without method
> declarations) and an interface.
>

The key difference in OO languages that do not allow multiple inheritance
is that you can always add an interface to an existing class but you can
only mix in an abstract class if your class doesn't extend another.

Let's say you want to define the contract for a UserDataAccessObject with
query and CRUD methods. If you make it an abstract class, I cannot
implement that contract using my AbstractMysqlDao base class. With an
interface, I can do

    class MysqlUserDao
            extends AbstractMysqlDao
            implements UserDataAccessObject

Being a dynamic language, PHP allows you to fulfill a contract without
using interfaces at all. You can call findUserByLogin() on any object--even
those that don't declare that interface via __call(). However, you won't be
able to pass your objects to methods that use parameter type hinting. This
is where interfaces really shine, and they become more important as your
project grows in complexity. They are certainly *not* required to make good
use of OOP, especially in PHP/Python/Ruby.

However, I view an interface as a statement (a contract) where IF you want
> someone to use your code you outline the methods you require them to
> flesh-out in their code  -- but I would like to see a simple example of
> that.
>

Interfaces come in handy when implementing the visitor and observer
patterns. Simple example are always contrived, but here's mine:

    interface Engine {
        function orderFuel(Store $store);
        function setSpeed($mph);
    }

    class SteamEngine implements Engine {
        function orderFuel(Store $store) {
            $store->order('coal', 1000, WeightUnit::POUND);
        }
        function setSpeed($mph) {
            if ($mph >= 80) {
                throw new InvalidArgumentException('Cannot exceed 80mph');
            }
            $this->loadFuel(...);
        }
    }

    class MrFusion implements Engine {
        function orderFuel(Store $store) {
            $store->order('aluminum can');
            $store->order('banana peel');
        }
        function setSpeed($mph) {
            if ($mph >= 88 && empty($this->destinationTime)) {
                throw new IllegalStateException('Must set desired time
travel destination');
            }
            $this->adjustThrottle($mph - $this->speed);
        }
    }

You could make Engine an abstract class, but that would reduce your users'
choice.

David

[Index of Archives]     [PHP Home]     [Apache Users]     [PHP on Windows]     [Kernel Newbies]     [PHP Install]     [PHP Classes]     [Pear]     [Postgresql]     [Postgresql PHP]     [PHP on Windows]     [PHP Database Programming]     [PHP SOAP]

  Powered by Linux