обьясните пожалуйста на пальцах - абстрактные классы - итерфейсы

texrdcom

Новичок
обьясните пожалуйста на пальцах - абстрактные классы - итерфейсы

Объясните пожалуйста на пальцах - абстрактные классы – интерфейсы.
Хотелось бы увидеть не большой но практический пример (даже в исполнении “helo -word”) чем пример будет проще тем лучше.
1) Для чего применяються интерфейсы ( в коротких статьях для множественного наследования – но как ?)
php5 oop
 

Demiurg

Guest
никак не применяй, они тебе не нужны.

ps а “helo -word” - это хорошо, да.
 

texrdcom

Новичок
Они мне нужны :)
А именно для изпользования в работе.
И нужен пример при изпользовании php5.
 

Dima_u

Guest
В php4 их нет. Ты сделай поиск по форуму, найдешь много чего, я сам эту тему начинал когда-то. Они нужны если у тебя реально большой проект над которым работает команда.
 

texrdcom

Новичок
Я так не считаю и для малых проектов хорошо ооп.
Можно много спорить и так дальше ... Но преимущества ооп наглядны и понятны - модульная система всегда будет выигрывать если конечно не пишеш гостевую книгу и все.

Меня конретно интересуют 2 вопроса которых я задал выше а остальное не важно.

-~{}~ 15.04.05 00:13:

К стати про абстрактные классы наглядно и понятно
http://a03-2003.mephist.ru/show_article.php?article=0000016&action=show_article
 

vladax

Новичок
Но преимущества ооп наглядны и понятны - модульная система всегда будет выигрывать если конечно не пишеш гостевую книгу и все.
ты ошибочно полагаешь, что модульную систему можно строить только при помощи ООП.
К стати про абстрактные классы наглядно и понятно
http://a03-2003.mephist.ru/show_article.php?article=0000016&action=show_article
ИМХО Слишком просто. На практике так не бывает.
 

Demiurg

Guest
>Они мне нужны
когда ты сможешь аргументировать это своё высказывание, ты получишь ответ на свой вопрос, причем от самого себя.
 

texrdcom

Новичок
Автор оригинала: Demiurg
>Они мне нужны
когда ты сможешь аргументировать это своё высказывание, ты получишь ответ на свой вопрос, причем от самого себя.
- С этим согласен на 100% :)
Я не прошу чтобы мне разжевали я прошу
пример использования интерфейсов, и к стати как еще построить нормальную модульную ситсему с сокрытием имен переменных и функцыи без классов я не знаю может подскажите ?
 

texrdcom

Новичок
Хорошо может так ?
PHP:
interface Int1 {
          function func1();
      }
      interface Int2 {
          function func2();
      }
      class MyClass implements Int1, Int2 {
          public function func1() {
              echo 1;  
          }
          public function func2() {
              echo 2;  
          }
     }
     $obj = new MyClass;
     $obj->func1(); // Выводит 1
     $obj->func2(); // Выводит 2
     
     class My2class implements Int1, Int2
     {
     public function func1() {
              echo 1;  
          }
          public function func2() {
              echo 2;  
          }
     
     }
Есть два класса оба используют два интерфейса в чем выгода ?
ведь без наследования класса классом мы все равно не получаем доступ к свойствам класса .
В чем радость этих интерфейсов ?
 

Nirth

Guest
я не владею PHP напишу пример для ActionScript 2.0 (язык во флеше)
Код:
interface animal {
    function sound():Void;
    function move():Void;
    die():Void
}
class cat implements animal{
    function sound(sndObj):Void{
       mjau.play();
    }
    function move():Void {
       this._x+=5
    }
    function die(){
        delete this
    }
}

class dog implements animal{
    function sound(sndObj):Void{
       gav.play();
    }
    function move():Void {
       this._x+=10
    }
    function die(){
        delete this
    }
}
теперь объясню, ты работаешь с 5 программистами, и вам надо сделать кучу классов,у которых будет ряд общих свойств, вы рисуете на бумаге план взаимодействия,выделяете общие свойства и пишете интерфейс.
Интерфейс это не навороченный экстенд, это просто способ организации, конечный результат никак не зависит от интерфейсов просто это способ избежать глупых ошибок аля забыл записать параметр функции
 

DimbIch

Новичок
самое интересное что после всего этого ИМХО человеку они так и не понадобяться...
как говориться... если не знаешь что это такое то скорее всего оно тебе не надо
 

texrdcom

Новичок
Да понятно что для улутшения работы команды для разбора кода по классу видно какие интерфейсы он включает и естествено в нем есть данные функции.
С этим разобрался.
Но в многих статьях даже в деталях написанно что интерфейсы можно использовать для множественого наследования -? чего интерфейсов -?
ведь интерфейс не может наследовать клас. Я правильно понимаю ?
 

Domovoj

Guest
Автор оригинала: texrdcom
Да понятно что для улутшения работы команды для разбора кода по классу видно какие интерфейсы он включает и естествено в нем есть данные функции.
С этим разобрался.
Но в многих статьях даже в деталях написанно что интерфейсы можно использовать для множественого наследования -? чего интерфейсов -?
ведь интерфейс не может наследовать клас. Я правильно понимаю ?
Их нельзя использовать для множественного наследования, т.к. у интерфейсов нечего наследовать.

Ещё один пример с интерфейсами. Пусть ты пишешь ОС на PHP, и тебе нужно написать кусок кода, который получает от мышки её координаты и состояние клавишь. Но у тебя ещё нет ни одного работающего драйвера мыши, да собственно их вообще ещё нет, так как никто не знает как их писать.

Вот ты и пишешь интерфейс доступа к драйверу мыши (т.е. просто указываешь, какие функции ты будешь использовать):

interface MouseDriver {
public function getX();
public function getY();
public function button1Clicked();
public function button2Clicked();
...
}

Всё, теперь везде в своей программе, которая обращается к драйверу мыши в качестве аргумента указываешь, что тебе нужен класс, реализующий интерфейс драйвера мыши:

function displayMouseCursor(MouseDriver $driver) {
$x = $driver->getX();
$y = $driver->getY();
...
}

Пишешь тестовый драйвер мыши и тестируешь свою прогу на нём. Вот и всё.

Теперь другие разработчики (компании производители мышек) просто пишут свои конкретные классы, реализующие твой интерфейс и всё работает (если конечно в этих новых классах нет ошибок).

Вывод: если у тебя не похожая ситуация, тебе НЕ НУЖНЫ интерфейсы. Интерфейсы нужны только для обозначания методов, которые должны выполнять реализующие их классы.

Про наследование. Наверно ты имел в виду нечто следующее:
PHP:
class A implements interfaceA, interfaceB  {....}
Это нужно, если у тебя один класс реализует функции сразу нескольких интерфейсов (например, он и драйвер мыши, и драйвер клавиатуры). Ни о каком множественном НАСЛЕДОВАНИИ здесь речи нет.

Абстрактные класс похожи на интерфейсы. Разница в том, что в абстрактных классах ты можешь заранее прописать логику, которая будет действительно наследоваться в дальнейшем.

Например:
PHP:
abstract class InchesMouseDriver implements MouseDriver {
   public function getX() {
       return $this->inchesToPixels($this->getInchX());
   }
   public function getY() {
      return $this->inchesToPixels($this->getInchY());
   }
    public function InchesToPixels($inches) {
       return round($inches*150);
    }
   abstract funtion getInchX();
   abstract function getInchY();
   abstract function button1Clicked();
   ....
}
Надеюсь смысл понятен - теперь ты наследуешь этот класс и просто переопределяешь getInchX и getInchY, и тебя уже не заботит, что мышка возвращает положение в дюймах.

БОЛЬШОЙ ВЫВОД: В маленьких проектах интерфейсы и абстрактные классы скорее всего не нужны.
 
Сверху