1 июл. 2015 г.

Композиция.

Механизм построения нового класса из объектов существующих классов называется композицией (composition).

И мы это уже не раз делали,  но просто не знали что это так называется :). Например в паттерне Builder мы внедрили объекты класса String (а String – это класс), как поля класса Contact. Точно так же мы могли бы использовать и объекты классов которые мы создали сами. Хотя по существу при композиции полями класса являются ссылки на объекты определенных классов. И мы можем использовать готовую функциональность этих классов. Например:

Co003

Вывод данной программы:

Co004

В этом примере видно что в наш класс MyClass мы включили два других класса как поля, а по существу как ссылки на объекты этих классов: String и MyString. Соответственно мы создали два поля ссылающихся на эти классы str и mystr, а затем в методе main() мы создали объект класса MyClass и использовали функциональность этих объектов, которые вывели нам результат.

Обратите внимание что в классе MyString мы переопределили метод класса Object toString(), что позволило нам вывести значение поля myStr, которое кстати тоже является ссылкой на объект.

Композиция позволяет повторно использовать существующий код или функциональность классов.

Но в случае композиции мы ни как не можем повлиять на эту функциональность используемых классов. Мы можем только использовать ее, но не изменить поведение, так как нам может быть нужно. Но есть и другой способ который гораздо интереснее когда новый класс создается как специализация уже существующего класса. Взяв существующий класс за основу, вы добавляете к нему свой код без изменения существующего класса. Этот механизм называется наследованием (inheritance). И далее мы переходим к изучению наследования в Java.

12 комментариев:

  1. Непонятно, что вызывает метод "toString()"?

    ОтветитьУдалить
    Ответы
    1. В данной программе этот метод не используется. Но вообще он просто возвращает значение переменной myStr.

      Удалить
    2. Странно, потому что без этого метода вторая строка выводится как ссылка, а для вывода "MyString" требуется написать "println(mc.mystr.myStr)"

      Удалить
    3. Извините да. Посмотрел не внимательно. Давно писал же :) Три года назад почти. Это переопределенный метод toString() базового класса Object.

      Удалить
    4. Mike, toString неявно вызывается при вызове методов записи, грубо говоря, в данном случае, под капотом println() вызывается метод toString

      Удалить
    5. Видишь суслика? Нет? А он есть)))

      Удалить
  2. Об этом у меня кстати в статье и написано. Вы не внимательно прочитали.

    ОтветитьУдалить
  3. Прочитал, только не понял почему он вызывается, ведь в этом коде ничего его не вызывает, это происходит неявно?

    ОтветитьУдалить
    Ответы
    1. Да это происходит не явно. Каждый класс наследуется от класса Object. И естественно наследует все его методы. Я про это еще не писал статью. Это было в планах. Но сейчас нет времени пока.

      Удалить
    2. Вот теперь прояснилось, спасибо, у вас замечательный блог)

      Удалить