2016-10-26 11 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()); 
    } 
} 

私は2つのクラス間の関係を特定しようとしていました。内部クラス内で外部クラスのプライベートメソッドにアクセスできるので、継承ではありません。内部クラスのオブジェクトは外部クラス内に保持されているため、少しアソシエーション関係になります。

+0

少なくとも、耳にとっては、人間がライフサイクル全体を完全に制御できるため、Compositionというのは明らかです。 –

+0

はい、UMLの用語では、人間 - 目関係と人間 - 耳関係の両方は、集約種別=合成の関連です。 –

+0

@ www.admiraalit.nl 'Eye'はpublicコンストラクタで公開されているので、別のクラスはそれ自身のインスタンスを取得することがあります。それは構成に違反します。 –

答えて

3

UML仕様の11.4.3.1

によれば、Aクラスは、クラスを含む、その範囲内に定義された分類器、各種の名前空間として機能します。ネストされたクラシファイアは、そのクラスを含む名前空間のメンバです。クラシファイアネストは、情報隠蔽の理由で使用されます。

あなたのケースでは、目と耳は人間に入れられています。残念ながら、仕様ではクラスのネスト演算子は提供されません。コンポーネントのネストされたクラス(11.6.5、特に図11.45を参照)に示唆されているように、追加コンパートメント(UMLは4コンパートメント以外のコンパートメントに表示できるものに多くの柔軟性を与えます)でそれらを提示できます。最終的には、パッケージに特有の表記を考慮することもできます。これは、入れ子になっているパッケージのサークル内のプラスの行(人間側の場合)です。これは12.2.5、特に図12.5に示されている。ただし、正式にはこの2番目の表記は、クラスではなくパッケージにのみ適しています。

+0

優れた答え。私は、「結局」という言葉がここで誤用されていると思います。あなたは "代わりに"を意味しましたか? –

+0

いいえ、私はこの表記法が正式にパッケージのためだけに定義されていて、質問はクラスについてのものなので、 "やっと"という意味です。仕様が何かを許可するのに十分明確でないときはいつも、私はわずかな励ましだけを使用しようとします。 「代替的に」少なくとも私の意見では、仕様の現段階では少し強くなるだろう。とにかく - あなたの信用に感謝します。 – Ister

+0

さて、英語は私の母国語ではありませんが、「結局」とは「長い時間が経った後」/「終わりに来たとき」と読みました。 –