Перейти к содержимому

Welcome to La2base.ru
Register now to gain access to all of our features. Once registered and logged in, you will be able to create topics, post replies to existing threads, give reputation to your fellow members, get your own private messenger, post status updates, manage your profile and so much more. If you already have an account, login here - otherwise create an account for free today!

Информация

  • Добавлена: окт 08 2016 11:15
  • Просмотров: 515
 


* * * * *
0 Рейтинг

Отношения между классами (объектами)

Написано alexiali окт 08 2016 11:15
классы объекты java
a1d95a9ec9c2.jpg
 
 
 
   По моей практике преподавания вопрос отношений между классами (или объектами) почему-то вызывает проблемы. Из-за чего так
 
происходит, не могу сказать. Когда я изучал ООП, мне это показалось настолько очевидным, что не стоило даже упоминания — вся логика ООП
 
не просто кричит, она вопиет об очевидности таких отношений и правилах их построения. Но тем не менее этот вопрос часто требует
 
объяснений. Чем мы сейчас и займемся, прежде чем продолжим изучение новых конструкций языка Java.
 
 
 
Теория ООП выделяет три основных отношения между классами:
 
 
1. Ассоциация
 
2. Агрегация и композиция
 
3. Обобщение/Расширение (наследование)
 
Последний пункт мы с вами уже рассматривали, так что сосредоточимся на первых двух.
 
 
 
 
Ассоциация
 
   Ассоциация означает, что объекты двух классов могут ссылаться один на другой, иметь некоторую связь между друг другом. Например
 
Менеджер может выписать Счет. Соответственно возникает ассоциация между Менеджером и Счетом. Еще пример — Преподаватель и Студент
 
— т.е. какой-то Студент учится у какого-то Преподавателя. Ассоциация и есть описание связи между двумя объектами. Студент учится у
 
Преподавателя. Идея достаточно простая — два объекта могут быть связаны между собой и это надо как-то описать.
 
 
 
Агрегация и композиция
 
Агрегация и композиция на самом деле являются частными случаями ассоциации. Это более конкретизированные отношения между
 
объектами.
 
 
Агрегация — отношение когда один объект является частью другого. Например Студент входит в Группу любителей физики.
 
 
Композиция — еще более «жесткое отношение, когда объект не только является частью другого объекта, но и вообще не может принадлежат
 
еще кому-то. Например Машина и Двигатель. Хотя двигатель может быть и без машины, но он вряд ли сможет быть в двух или трех машинах
 
одновременно. В отличии от студента, который может входить и в другие группы тоже. Такие описания всегда несколько условны, но тем не
 
менее.
 
 
 
Техническая реализация
 
 
   На самом деле каких-либо сложных и высокоумных технических решений нет — все достаточно тривиально. В одном классе делается ссылка
 
на другой и наоборот (не всегда). Дальше идет развитие данной идеи в зависимости например от количества связей. В машине четыре колеса и 
 
она имеет связь со всеми — значит в машине будет ссылка на список колес (или массив). Давайте соединим нашего робота с оператором,
 
который им управляет. Между ними можно установить ассоциацию через ссылки в одном классе на другой класс. Т.е. класс Robot имеет ссылку
 
на класс Operator и наоборот — класс Operator имеет ссылку на класс Robot.
 
 
 
Класс Robot
 

package edu.javacourse.robot;

public class Robot
{
    private double x = 0;
    private double y = 0;
    protected double course = 0;
    // Робот управляется оператором
    private Operator operator;

    public Robot(double x, double y) {
        this.x = x;
        this.y = y;
    }

    // Можно узнать какой оператор управляет роботом
    public Operator getOperator() {
        return operator;
    }

    // Можно установить оператора для робота
    public void setOperator(Operator operator) {
        this.operator = operator;
    }

    public void forward(int distance) {
        x = x + distance * Math.cos(course / 180 * Math.PI);
        y = y + distance * Math.sin(course / 180 * Math.PI);
    }

    public double getX() {
        return x;
    }

    public double getY() {
        return y;
    }

    public double getCourse() {
        return course;
    }

    public void setCourse(double course) {
        this.course = course;
    }

    public void printCoordinates() {
        System.out.println(x + "," + y);
    }
}

Класс Operator

package edu.javacourse.robot;

public class Operator
{
    private String firstName;
    private String lastName;
    // Оператор управляет конкретным роботом
    private Robot robot;

    public Operator(String firstName, String lastName) {
        this.firstName = firstName;
        this.lastName = lastName;
    }

    public String getFirstName() {
        return firstName;
    }

    public String getLastName() {
        return lastName;
    }

    // У оператора можно спросить каким роботом он управляет
    public Robot getRobot() {
        return robot;
    }

    // Оператору можно поручить управлять роботом
    public void setRobot(Robot robot) {
        this.robot = robot;
    }
}
   Чего-то другого человечество пока не придумало. Как я уже упоминал, можно несколько разнообразить виды ссылок, но идея останется
 
прежней. Можно делать ссылки только в одном классе — тогда связь будет односторонняя, может быть несколько ссылок или ссылка на список
 
(массив). Но все равно сказать одному классу, что он связан с другим можно только по такому принципу.
 
 
   Кстати, когда мы размещали наши компоненты с овалом, прямоугольником на форме, то тут можно говорить о композиции — форма
 
содержит внутри себя список компонентов класса JComponent для хранения всех компонентов, которые ей передают.
 
 
   Еще один способ взаимодействия объектов
 
Эта ситуация возникает тогда, когда постоянной связи между объектами не предусматривается вообще, но какие-то данные надо передать от
 
одного другому. Можно воспользоваться вариантом передачи объекта прямо в методе. Например, наш робот может иметь метод, который
 
принимает данные из другого робота — его координаты — для того, чтобы туда переместиться. Значит надо сделать метод, который в качестве
 
параметра будет иметь объект класса Robot.
 
 
Как видите все достаточно банально и просто. Мы очень скоро столкнемся с этими понятиями при рассмотрении примеров.
 
 
Источник: java-course.ru
 

Всем хорошего настроения! : )

 

 

 

0 Комментариев
или Войти


Powered by Tutorials 1.5.0 © 2017, by Michael McCune