Форум программистов, компьютерный форум, киберфорум
Java SE (J2SE)
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.80/5: Рейтинг темы: голосов - 5, средняя оценка - 4.80
88 / 86 / 55
Регистрация: 14.11.2015
Сообщений: 1,099

Composition over inheritance

31.10.2017, 15:56. Показов 1197. Ответов 6
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Мне не совсем понятно, при композиции нам нужно дублировать поля, которые в случае наследования не нужно было бы дублировать?

Наследование:

Java
1
2
3
4
5
6
public abstract class Animal {
    private String name;
    private int weight;
 
    ...
}
Java
1
2
3
4
5
6
7
8
9
10
11
12
13
public class Cat extends Animal {
    @Override
    public void voice() {
        System.out.println("Meow");
    }
 
    @Override
    public void move() {
        System.out.println("Cat is moving");
    }
    
    ...
}
Java
1
2
3
4
5
6
7
8
9
10
11
12
13
public class Dog extends Animal {
    @Override
    public void voice() {
        System.out.println("Woof!");
    }
 
    @Override
    public void move() {
        System.out.println("Dog is moving");
    }
    
    ...
}

Композиция:

Java
1
2
3
4
5
6
7
public interface Moveable {
    public void move();
}
 
interface Voiceable {
    public void voice();
}
Java
1
2
3
4
5
6
7
8
9
10
11
12
13
14
public class Cat implements Voiceable, Moveable{
    private String name;
    private int weight;
 
    @Override
    public void move() {
            
    }
 
    @Override
    public void voice() {
 
    }
}
Java
1
2
3
4
5
6
7
8
9
10
11
12
13
14
public class Cat implements Voiceable, Moveable{
    private String name;
    private int weight;
 
    @Override
    public void move() {
 
    }
 
    @Override
    public void voice() {
 
    }
}
0
IT_Exp
Эксперт
34794 / 4073 / 2104
Регистрация: 17.06.2006
Сообщений: 32,602
Блог
31.10.2017, 15:56
Ответы с готовыми решениями:

Templates (composition). exception handling run-time error
Код компилируется. Если делать циклы для push and pop размера такого чтоб не превышало размеры Стока то все работает нормально если...

Inheritance
Доброго времени суток. Роберт Лафоре "ОБЪЕКТНО-ОРИЕНТИРОВАННОЕ ПРОГРАММИРОВАНИЕ В C++", 2004 год. Глава 9. Задание 8. 8. В...

Generic inheritance. Templates
Код компилируется. Не могу разобраться то ли я как не правильно иерархию построил то ли компилятор глючит. Вообщем если я пишу в...

6
 Аватар для ArtemFM
746 / 493 / 285
Регистрация: 10.09.2015
Сообщений: 1,530
31.10.2017, 16:04
По сути, как я понял ранее, интерфейс - это набор действий объекта (методов). Абстрактный класс - набор свойств объекта
Поэтому при имплементации тебе придётся создавать поля, ибо в интерфейсе их нет, но если сделать такую конструкцию

интерфейс (набор методов) -> абстрактный класс (поля и по возможности реализация методов из интерфейса, если они в наследниках будут идентичны) -> классы наследники
1
88 / 86 / 55
Регистрация: 14.11.2015
Сообщений: 1,099
31.10.2017, 16:12  [ТС]
ArtemFM, тогда, если я не ошибаюсь, для большей гибкости нужно делать так: абстрактный класс только с полями + методы на интерфейсах. В итоге получится
Java
1
2
3
class Dog extends Animal implements Voiceable, Moveable {
    ...
}
0
 Аватар для ArtemFM
746 / 493 / 285
Регистрация: 10.09.2015
Сообщений: 1,530
31.10.2017, 16:48
ну так для идеального кода, а вообще всё можно зафигачить и в абстрактный к примеру или с джава 1.8 (или 1.7 не помню точно) и в интерфейс. Они теперь поддерживают дефолтную реализацию методов

Добавлено через 1 минуту
Dog extends Animal
a Animal implements Voiceable, Moveable.

Вот так

Добавлено через 20 минут
Java
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
interface Animal {
    String getName();
    int getWeight();
    void setName(String name);
    void setWeight(int weight);
    void move();
    void voice();
}
 
abstract class AbstractAnimal implements Animal {
    String name;
    int weight;
 
    @Override
    public String getName() {
        return name;
    }
 
    @Override
    public int getWeight() {
        return weight;
    }
 
    @Override
    public void setName(String name) {
       this.name = name;
    }
 
    @Override
    public void setWeight(int weight) {
       this.weight = weight;
    }
}
 
class Dog extends AbstractAnimal {
 
    @Override
    public void move() {
        System.out.println(name + " is run");
    }
 
    @Override
    public void voice() {
        System.out.println(name + " is Woof!");
    }
}
0
31.10.2017, 16:50

Не по теме:

Может стоит посмотреть на это в менее абстрактной призме:
Интерфейс, это по сути "контракт", обеспечивающий совместимость (реализацию всех необходимых методов).

А абстрактный класс, это "фундамент", группирующий в себе базовые/общие понятия необходимые всем возможным подклассам, но при этом не "дотягивающий", не являющийся сам по себе достаточным для полного описания сущности.

0
Эксперт функциональных языков программированияЭксперт Java
 Аватар для korvin_
4576 / 2775 / 491
Регистрация: 28.04.2012
Сообщений: 8,780
31.10.2017, 22:05
Цитата Сообщение от Artmal Посмотреть сообщение
Композиция:
Это не композиция. Вот это композиция, например:

Java
1
2
3
4
5
6
public interface Subject {
 
    String getName();
 
    int getWeight();
}
Java
1
2
3
4
5
6
public interface Behavior {
 
    void move();
 
    void voice();
}
Java
1
2
public interface Animal extends Subject, Behavior {
}
Java
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
final class SubjectImpl implements Subject {
 
    private final String name;
    private final int weight;
 
    SubjectImpl(String name, int weight) {
        this.name = name;
        this.weight = weight;
    }
 
    @Override
    public String getName() {
        return name;
    }
 
    @Override
    public int getWeight() {
        return weight;
    }
}
Java
1
2
3
4
5
6
7
8
9
10
11
12
public final class CatBehavior implements Behavior {
 
    @Override
    public void move() {
        System.out.println("Cat is moving");
    }
 
    @Override
    public void voice() {
        System.out.println("Meow");
    }
}
Java
1
2
3
4
5
6
7
8
9
10
11
12
public final class DogBehavior implements Behavior {
 
    @Override
    public void move() {
        System.out.println("Dog is moving");
    }
 
    @Override
    public void voice() {
        System.out.println("Woof!");
    }
}
Java
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
final class AnimalImpl implements Animal {
 
    private final Subject subject;
    private final Behavior behavior;
 
    AnimalImpl(Subject subject, Behavior behavior) {
        this.subject = subject;
        this.behavior = behavior;
    }
 
    @Override
    public void move() {
        behavior.move();
    }
 
    @Override
    public void voice() {
        behavior.voice();
    }
 
    @Override
    public String getName() {
        return subject.getName();
    }
 
    @Override
    public int getWeight() {
        return subject.getWeight();
    }
}
Java
1
2
3
4
5
6
7
8
9
10
11
12
13
14
public final class Animals {
 
    public static Animal newCat(String name, int weight) {
        return new AnimalImpl(new SubjectImpl(name, weight), new CatBehavior());
    }
 
    public static Animal newDog(String name, int weight) {
        return new AnimalImpl(new SubjectImpl(name, weight), new DogBehavior());
    }
 
    private Animals() {
        throw new UnsupportedOperationException();
    }
}
2
 Аватар для HighPredator
6045 / 2160 / 753
Регистрация: 10.12.2010
Сообщений: 6,005
Записей в блоге: 3
01.11.2017, 12:15
Цитата Сообщение от Artmal Посмотреть сообщение
Мне не совсем понятно, при композиции нам нужно дублировать поля, которые в случае наследования не нужно было бы дублировать?
Нет. Покажу на примере. Пусть есть обычный класс-пара:
Java
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
public class Pair<T1, T2> {
    private T1 first;
    private T2 second;
 
    public Pair(final T1 first, final T2 second) {
        this.first = first;
        this.second = second;
    }
 
    public T1 getFirst() {
        return first;
    }
 
    public T2 getSecond() {
        return second;
    }
}
Пусть нам нужно сделать класс "пару-для-замены", содержащий маску и значение (для передачи в replaceAll). Очевидно, что ко второму классу применимо отношение "is-a", то есть второй может наследовать первый. Однако, вменяемо пронаследовавшись (сделав нормальные геттеры и т.д.) мы получим явное дублирование апи. "Composition over inheritance" позволяет ибавиться от этой проблемы, сохраняя отношение "is-a" в архитектурном смысле. Смотрите:
Java
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
public class ReplacementPair {
    private Pair<String, String> pair;
 
    public ReplacementPair(final String mask, final String value) {
        pair = new Pair<String, String>(mask, value);
    }
 
    public String getMask() {
        return pair.getFirst();
    }
 
    public String getValue() {
        return pair.getSecond();
    }
}
2
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
BasicMan
Эксперт
29316 / 5623 / 2384
Регистрация: 17.02.2009
Сообщений: 30,364
Блог
01.11.2017, 12:15
Помогаю со студенческими работами здесь

Неоднозначность и multiple inheritance
Есть такая иерархия и main(): #include &lt;iostream&gt; #include &lt;string&gt; #include &lt;complex&gt; using namespace std; class Base { ...

Copy Constructor Question .Generic inheritance. Templates
Допустим есть проект // // (---.Array_hpp---) // #ifndef Array_HPP // Preprocessor gates #define...

Templates. (concrete inheritance). question to destructor implementation
Есть вот такой вот проект. Идея в том том что конкретный класс наследуется от темплейта. Как в таком случае ПРАВИЛЬНО + ГРАМОТНО...

Не могу создать 2 класса header-composition и header-social
При создании 2 классов. например header-composition и hedaer-social первый работает, а второй уже нет, его просто браузер не видит через...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
7
Ответ Создать тему
Новые блоги и статьи
Отправка уведомления на почту при изменении наименования справочника
Maks 24.03.2026
Программная отправка письма электронной почты на примере изменения наименования типового справочника "Склады" в конфигурации БП3. Перед реализацией необходимо выполнить настройку системной учетной. . .
модель ЗдравоСохранения 5. Меньше увольнений- больше дохода!
anaschu 24.03.2026
Теперь система здравосохранения уменьшает количество увольнений. 9TO2GP2bpX4 a42b81fb172ffc12ca589c7898261ccb/ https:/ / rutube. ru/ video/ a42b81fb172ffc12ca589c7898261ccb/ Слева синяя линия -. . .
Midnight Chicago Blues
kumehtar 24.03.2026
Такой Midnight Chicago Blues, знаешь?. . Когда вечерние улицы становятся ночными, а ты не можешь уснуть. Ты идёшь в любимый старый бар, и бармен наливает тебе виски. Ты смотришь на пролетающие. . .
Контроль уникальности заводского номера - вариант №2
Maks 24.03.2026
В отличие от предыдущего варианта добавлено прерывание циклов, также добавлены новые переменные для сохранения контекста ошибки перед прерыванием цикла: Процедура ПередЗаписью(Отказ, РежимЗаписи,. . .
SDL3 для Desktop (MinGW): Вывод текста со шрифтом TTF с помощью библиотеки SDL3_ttf на Си и C++
8Observer8 24.03.2026
Содержание блога Финальные проекты на Си и на C++: finish-text-sdl3-c. zip finish-text-sdl3-cpp. zip
Жизнь в неопределённости
kumehtar 23.03.2026
Жизнь — это постоянное существование в неопределённости. Например, даже если у тебя есть список дел, невозможно дойти до точки, где всё окончательно завершено и больше ничего не осталось. В принципе,. . .
Модель здравоСохранения: работники работают быстрее после её введения.
anaschu 23.03.2026
geJalZw1fLo Корпорация до введения программа здравоохранения имела много невыполненных работниками заданий, после введения программы количество заданий выросло. Но на выплатах по больничным это. . .
Контроль уникальности заводского номера - вариант №1
Maks 23.03.2026
Алгоритм контроля уникальности заводского (или серийного) номера на примере нетипового документа выдачи шин для спецтехники с табличной частью, разработанного в конфигурации КА2. Данные берутся из. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru