ФорумПрограммированиеPHP для идиотовPHP и ООП → Нестыковка между наследованием и полиморфизмом.

Нестыковка между наследованием и полиморфизмом.

  • Rotten

    Сообщения: 2243 Репутация: N Группа: Адекваты

    Spritz 29 сентября 2010 г. 12:02

    Есть архетиктура.


    interface FileOperationVisitorInterface
    {
    public function run();

    public function execute();

    public function toggleNextItem2();
    }

    abstract class AbstractFOVisitor implements FileOperationVisitorInterface
    {

    public function run()
    {

    }

    public function execute()
    {

    }

    public function toggleNextItem2()
    {

    }
    }

    // два наследующих класса

    class CopyFileVisitor extends AbstractFOVisitor
    {

    public function run()
    {
    //тут какойто код
    }

    public function execute()
    {
    //тут какойто код
    }

    public function toggleNextItem2()
    {
    //тут какойто код
    }
    }

    class MoveFileVisitor extends AbstractFOVisitor
    {

    public function run()
    {
    //тут какойто код
    }

    public function execute()
    {
    //тут какойто код
    }

    public function toggleNextItem2()
    {
    //тут какойто код
    }
    }



    Есть одна проблема: все методы абстрактного и наследующих классов мне не надо указывать в public. Нужна инкапсуляция, тоесть private, хотя для полей вообще нужно protected…
    Но если я их так обьявлю, то придеться и в интерфейсе так обьявить. Но если я и в интерфейсе так обьявлю, - то интерпретатор скажет что я - чмо, потомучто в спецификации так нельзя. Только модификаторы public.

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

    Какие приемы существуют?

  • vasa_c

    Сообщения: 3127 Репутация: N Группа: в ухо

    Spritz 29 сентября 2010 г. 12:09, спустя 6 минут 56 секунд

    Полиморфизм связан с интерфейсом предоставляемым объектом прикладному коду. этот интерфейс - только public.
    Спустя 81 сек.
    Что будет вызываться извне? run()? execute()? toggle()?
  • Rotten

    Сообщения: 2243 Репутация: N Группа: Адекваты

    Spritz 29 сентября 2010 г. 12:23, спустя 13 минут 57 секунд

    vasa_c, в том то и вся суть что ничего. Максимум - методы родителей, тоесть толко в контексте protected.
  • Nyaah

    Сообщения: 574 Репутация: N Группа: Джедаи

    Spritz 29 сентября 2010 г. 12:42, спустя 18 минут 33 секунды

    Интерфейс, посути, это набор правил с помощю который объект общается с внешним миром, потому и возможны только паблик методы. А чего тебя не устраивает в родительсом абстрактном классе, без интерфейсов? Интерфейс пишется для других разработчиков, то что внутри твоей библиотеки происходит, это твоя проблема, просто должен быть возвращён какой-то определённый результат, поэтому забей на интерфейс с защищёнными методами и наследуй все объекты от абстрактного класса, он именно для этого и придуман =)


    interface FileOperationVisitorInterface
    {
    public function somethingDo();
    }
    abstract class AbstractFOVisitor implements FileOperationVisitorInterface
    {

    abstract protected function run();
    abstract protected function execute();
    abstract protected function toggleNextItem2();

    public function somethingDo()
    {
    // …
    $this->run();
    // …
    $this->execute();
    // …
    $this->toggleNextItem2();
    // …
    return 'Ouuueeee baby';
    }
    }
    Work, buy, consume, die
  • Trej Gun

    Сообщения: 5299 Репутация: N Группа: в ухо

    Spritz 29 сентября 2010 г. 13:12, спустя 30 минут 2 секунды

    у тебя не несостыковка. у тебя не понимание смысла интерфейса
  • Rotten

    Сообщения: 2243 Репутация: N Группа: Адекваты

    Spritz 29 сентября 2010 г. 13:13, спустя 1 минуту 46 секунд

    Nyaah, Я сначала так и сделал… А потом возникла надобность в обязательной реализации этих 3-х методов во всех дочерних классах. Нужно чтобы IDE напоминал о них…
  • Rotten

    Сообщения: 2243 Репутация: N Группа: Адекваты

    Spritz 29 сентября 2010 г. 13:28, спустя 14 минут 12 секунд

    CTAPbIu_MABP, Ну а что если мне нужно обязательно этих 3 метода реализовать во всех потомках?(как это было бы в случае без наследования).
    Тоесть такому типу должно следовать все "генетическое" дерево классов..
  • Trej Gun

    Сообщения: 5299 Репутация: N Группа: в ухо

    Spritz 29 сентября 2010 г. 13:37, спустя 9 минут 6 секунд

    Rotten, а интерфейс зачем вообще? предполагаться замена классов другими реализациями?
  • vasa_c

    Сообщения: 3127 Репутация: N Группа: в ухо

    Spritz 29 сентября 2010 г. 13:46, спустя 9 минут 45 секунд

    Rotten, как объекты этого класса будут использоваться во внешнем коде?
  • Rotten

    Сообщения: 2243 Репутация: N Группа: Адекваты

    Spritz 29 сентября 2010 г. 13:50, спустя 3 минуты 17 секунд

    CTAPbIu_MABP, Например, в моей ситуации - предполагается обязательный override вышеописанных методов в потомках. Тоесть это бы послужило типа напоминания для меня обязательно их позамещать…

    Вообщем - я так понял, адекватное решение состоит в том чтобы для себя гдето в коде комментировать такие напоминания и обходится без интерфесов…

    Спустя 137 сек.
    vasa_c, какого именно?
  • vasa_c

    Сообщения: 3127 Репутация: N Группа: в ухо

    Spritz 29 сентября 2010 г. 13:58, спустя 8 минут 4 секунды

    какого именно?

    любого. пример.
  • Rotten

    Сообщения: 2243 Репутация: N Группа: Адекваты

    Spritz 29 сентября 2010 г. 14:45, спустя 47 минут 2 секунды

    как обычно.
    $cf = new CopyFileVisitor($param1);
  • Trej Gun

    Сообщения: 5299 Репутация: N Группа: в ухо

    Spritz 29 сентября 2010 г. 14:56, спустя 11 минут 34 секунды

    а что по твоему мнению будет в переменной $cf и как это использовать?
  • Rotten

    Сообщения: 2243 Репутация: N Группа: Адекваты

    Spritz 29 сентября 2010 г. 15:08, спустя 11 минут 46 секунд

    объект типа CopyFileVisitor. А использовать… ну так как архитектура приложения предусматривает…
  • vasa_c

    Сообщения: 3127 Репутация: N Группа: в ухо

    Spritz 30 сентября 2010 г. 4:08, спустя 12 часов 59 минут 28 секунд

    ну так как архитектура приложения предусматривает…

    Использовать объект можно так, как предусматривает архитектура самого объекта. Какие методы у него будут публичными?

Пожалуйста, авторизуйтесь, чтобы написать комментарий!