Что это за отношение?(Прочитано 22185 раз)
Что это за отношение? : 23 Июля 2008, 21:57:24
Коллеги, столкнулся тут с ситуацией, решение по которой точного не смог получить.

В чем суть?

Пусть есть некоторый класс МойКласс и еще один ДругойМойКласс.

При этом в пределах метода класса МойКласс идет создание экземпляра ДругойМойКласс

Примером такой ситуации может служить такой вот код:

public class МойКласс
{
  public static void main(String[] args)
  {
       ДругойМойКласс обДругойМойКласс = new ДругойМойКласс();
       обДругойМойКласс.Writeln("Hello World");
  }
}

import javax.swing.JOptionPane;

public class ДругойМойКласс
{
  private Какие-тоАтрибуты;

  public void Writeln(String messageString)
  {
   /*Это функция вывода строки messageString в
    * наш импровизированный терминал.
    * */
  }

}

В каком отношении будут находится эти два класса? В отношении ассоциации, или же в отношении зависимости?
Я склоняюсь ко второму типу, хотя у Рамбо зависимость обычно используется в том случае, когда в методе класса А в качестве параметра используется класс Б...



Re: Что это за отношение? Ответ #1 : 23 Июля 2008, 22:21:18
Это зависимость.
Причем существует по крайне мере два способа ее изобразить (см. рисунок)



Re: Что это за отношение? Ответ #2 : 23 Июля 2008, 22:22:37
... у Рамбо зависимость обычно используется в том случае, когда в методе класса А в качестве параметра используется класс Б...

Такая зависимость обычно идет без стереотипа.



Re: Что это за отношение? Ответ #3 : 23 Июля 2008, 23:30:41
Denis, спасибо. Я действительно склонялся к этой же мысли. Правда только сомневался в стереотипе.

Для закрепления. Если один класс создает (инстанцирует) другой, т.е. в методе класса А создается объект класса Б, то это зависимость со стереотипом.

Вопрос. Такого класса зависимость возникает только тогда, когда в конструкторе класса-источника происходит создание экземпляров целевого класса? Или это не имеет значения? Главное сам факт, что в каком-то методе класса А создается объект класса Б.

----

Еще вот возник вопрос.
Бывает, что в определении одного класса мы определяем какой-то другой класс. Ну на подобии объявления и описани функции внутри другой функции. При этом ясно, что внутреняя функция имеет локальную видимость и реализуется только в пределах внешней функции. Как я понимаю также происходить и с внутренним классом.

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



Re: Что это за отношение? Ответ #4 : 24 Июля 2008, 00:01:39
Для закрепления. Если один класс создает (инстанцирует) другой, т.е. в методе класса А создается объект класса Б, то это зависимость со стереотипом.
Да. Причем возможны два варианта (см. рисунок в предыдущем ответе).
В первом варианте имеем зависимость между КЛАССАМИ со стереотип <<instantiate>>.
Во втором имеем зависимость между КЛАССОМ и ОБЪЕКТОМ, а стереотип <<create>> ставим у того метода, который создает объект другого класса.
Вторая нотация (c <<create>>) на практике встречается гораздо реже первой.

Вопрос. Такого класса зависимость возникает только тогда, когда в конструкторе класса-источника происходит создание экземпляров целевого класса? Или это не имеет значения? Главное сам факт, что в каком-то методе класса А создается объект класса Б.

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

Ответ: не имеет значения. Но если исходя из контекста это надо показать -  пишите комментарий.

Еще вот возник вопрос.
Бывает, что в определении одного класса мы определяем какой-то другой класс. Ну на подобии объявления и описани функции внутри другой функции. При этом ясно, что внутреняя функция имеет локальную видимость и реализуется только в пределах внешней функции. Как я понимаю также происходить и с внутренним классом.

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

Между классами такое отношение показывается как на прикрепленном рисунке. Для меня это отношение - namespace, но думаю, что под nested понимали тоже самое.
Отношение вложенности между функциями невозможно показать (кроме как в комментарии).

О применении вложенных классов советую поговорить со знакомыми программистами на Java и спросить как они оформляют обработчики событий от GUI элементов. Какая-то часть респондентов ответит, что через вложенные классы.



Re: Что это за отношение? Ответ #5 : 24 Июля 2008, 00:13:51
Еще вот возник вопрос.
Бывает, что в определении одного класса мы определяем какой-то другой класс. Ну на подобии объявления и описани функции внутри другой функции. При этом ясно, что внутреняя функция имеет локальную видимость и реализуется только в пределах внешней функции. Как я понимаю также происходить и с внутренним классом.
А пример кода можна, не совсем понял (давно не брал я шашку код в руки)
Не важно какой ты сейчас - большой или маленький, важно - как ты растешь.
Б.А.С.



Re: Что это за отношение? Ответ #6 : 24 Июля 2008, 01:07:37
О применении вложенных классов советую поговорить со знакомыми программистами на Java и спросить как они оформляют обработчики событий от GUI элементов. Какая-то часть респондентов ответит, что через вложенные классы.
Вся беда - таких знакомых нет. Так что, если у вас есть что сказать, очень интересно обсудить.

Пример кода для Саши могу вот показать.

Правда код не мой, а моего студента

/* Это секция импорта классов и пакетов, здесь мы пишем то,
 * чьи функции мы хотим позаимствовать в нашем классе.
 * Притом мы не знаем как они реализованы - это и есть инкапсуляция.
 **/
import java.awt.Container;
import java.awt.Font;
import java.awt.TextArea;
import java.awt.event.WindowAdapter;
import java.awt.event.WindowEvent;

import javax.swing.JFrame;

/**
 * @author Scotty
 * Здесь мы берём стандартный класс JFrame
 * и наследуя его, дополняем его функцими,
 * которые нам нужны. А именно переписываем его
 * конструктор на свой чтобы не делать это при создании
 * класса MyShell. Таким образом мы прибегаем к
 * полиморфизму.
 */
@SuppressWarnings("serial")

class MyShellFrame extends JFrame
{
private TextArea ShellTextArea;

  public MyShellFrame()
  {
    setSize(700, 500);
    ShellTextArea = new TextArea("", 1024, 64);
   
   Font ShellFont = new Font("DialogInput", Font.PLAIN, 12);
   
   ShellTextArea.setFont(ShellFont);
   
    Container contentPane = getContentPane();
   
    contentPane.add(ShellTextArea, "Center");
   
    addWindowListener(new WindowCloser());
  }

  public void appendString(String inputString)
  {
   ShellTextArea.append(inputString);
  }

// вот он вложенный класс
  private class WindowCloser extends WindowAdapter
  {
    public void windowClosing(WindowEvent event)
    {
      System.exit(0);
    }
  }
}



Re: Что это за отношение? Ответ #7 : 24 Июля 2008, 01:10:22
Ну я так и предполагал, все таки С++ в инсте - это сила :)

А это разве не часть-целое в ЮМЛ2 ?
Не важно какой ты сейчас - большой или маленький, важно - как ты растешь.
Б.А.С.



Re: Что это за отношение? Ответ #8 : 24 Июля 2008, 07:10:49
Пример кода для Саши могу вот показать.

Это оно и есть.
Обработчик событий окна (в данном случае только одно событие - закрытие окна) - WindowCloser оформлен как внутренний класс.



Re: Что это за отношение? Ответ #9 : 24 Июля 2008, 07:12:35
А это разве не часть-целое в ЮМЛ2 ?

Нет.



Re: Что это за отношение? Ответ #10 : 24 Июля 2008, 11:00:54
А что такое тогда целое-часть на ДК?
Не важно какой ты сейчас - большой или маленький, важно - как ты растешь.
Б.А.С.



Re: Что это за отношение? Ответ #11 : 24 Июля 2008, 11:56:21
А что такое тогда целое-часть на ДК?

Отношение "часть-целое" - это частный случай ассоциации. Агрегация или композиция.

В приведенном примере (by Galogen) есть ассоциация (пожалуй даже агрегация) между MyShellFrame и TextArea.
MyShellFrame ВСЕГДА знает что есть такой объект - ShellTextArea, который является экземпляром класса TextArea.
Ключевое слово - ВСЕГДА.

А не от случая к случаю, как это происходит с WindowCloser (в данном случае здесь отношение зависимости).

Ведь на самом деле если бы WindowCloser был бы объявлен вне класса MyShellFrame суть бы не поменялась. Просто разработчик средствами языка хотел скрыть класс WindowCloser от всех кроме MyShellFrame. Какая же здесь ассоциация?



Re: Что это за отношение? Ответ #12 : 24 Июля 2008, 12:19:24
Да, согласен, тут же нет у нас объявление объекта в классе MyShellFrame, а просто вызов объекта WindowCloser из ф-ции. Это я что-то просмотрел.
Не важно какой ты сейчас - большой или маленький, важно - как ты растешь.
Б.А.С.



Re: Что это за отношение? Ответ #13 : 24 Июля 2008, 18:01:29
Да, согласен, тут же нет у нас объявление объекта в классе MyShellFrame, а просто вызов объекта WindowCloser из ф-ции. Это я что-то просмотрел.

// вот он вложенный класс
  private class WindowCloser extends WindowAdapter
  {
    public void windowClosing(WindowEvent event)
    {
      System.exit(0);
    }
  }

а это прости что такое?



Re: Что это за отношение? Ответ #14 : 24 Июля 2008, 18:18:31
а это прости что такое?

Имелось в виду, что в классе MyShellFrame не объявлено атрибута с типом WindowCloser.




 

Sitemap 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19