2016-10-26 14 views
1

Я столкнулся с похожим сценарием проекта, над которым я сейчас работаю. Я попытался имитировать то же самое с некоторым общим контекстом. Выполните следующий код:Отношение внутреннего внутреннего класса

interface Receptor 
{ 
    public void recept(); 
} 

class Human 
{ 
    private void bloodCirculate(String receptor) 
    { 
     System.out.println("Blood flows in " + receptor); 
    } 

    public class Eye implements Receptor 
    {  
     @Override 
     public void recept() 
     { 
      bloodCirculate("eye"); 
      System.out.println("Look");  
     } 
    } 

    private class Ear implements Receptor 
    {  
     @Override 
     public void recept() 
     { 
      bloodCirculate("ear"); 
      System.out.println("Listen");  
     } 
    } 

    private void recept(Receptor receptor) 
    { 
     receptor.recept();  
    } 

    public void look() 
    { 
     recept(new Eye()); 
    } 

    public void listen() 
    { 
     recept(new Ear()); 
    } 
} 

Я пытался идентифицировать отношения между двумя классами. Это не наследование, потому что частные методы внешнего класса доступны во внутреннем классе. Он слегка смотрит на отношение Ассоциации, поскольку объект внутреннего класса хранится внутри внешнего класса.

+0

По крайней мере, для уха это явно состав, так как человек имеет полный контроль над своим жизненным циклом. –

+0

Да, в терминах UML отношения Human-Eye и Human-Ear являются ассоциациями типа aggregation = Composite. –

+0

@ www.admiraalit.nl Поскольку 'Eye' является общедоступным с открытым конструктором, другой класс может получить свой собственный экземпляр. Это нарушит состав. –

ответ

3

В соответствии с 11.4.3.1 спецификации UML

А Класс действует в качестве пространства имен для различных видов классификаторов, определенных в пределах его объема, в том числе классов. Вложенные классификаторы являются членами пространства имен содержащего класса. Разбивка классификатора используется для скрытия информации.

Так что в вашем случае глаза и ухо вложены в человека. К сожалению, спецификация не предоставляет оператора вложенности для классов. Вы можете представить их в дополнительном отсеке (UML оставляет много гибкости в том, что вы можете представить в отсеках, отличных от 4 обязательных), как предлагается для вложенных классов для компонента (см. 11.6.5, особенно на рисунке 11.45). В конечном итоге вы также можете рассмотреть нотацию, специфичную для Packages, то есть линию с плюсом в круге в пакете вложенности (в вашем случае на стороне человека). Это представлено в 12.2.5, особенно на рисунке 12.5. Обратите внимание, однако, что формально это второе обозначение подходит только для пакетов, а не для классов.

+0

Отличный ответ. Я думаю, что слово «в конце концов» здесь используется неправильно. Вы имели в виду «альтернативно»? –

+0

Нет, я имел в виду «в конце концов», поскольку это обозначение формально определено только для пакетов, и вопрос касается классов. Всякий раз, когда спецификация недостаточно ясна, позволяя что-то, я пытаюсь использовать только небольшие поощрения. «Альтернативно» будет немного сильным на нынешнем этапе спецификации, по крайней мере, на мой взгляд. В любом случае - спасибо за кредит. – Ister

+0

Хорошо, английский не мой родной язык, но я читал «в конце концов» как «после долгого времени»/«когда вы пришли в конце», а не как «возможно, если вам действительно нужно». –