【问题标题】:Inner Outer class relationship内部外部类关系
【发布时间】:2016-10-26 13:41:41
【问题描述】:

我在当前正在进行的项目中遇到了类似的情况。我尝试用一​​些一般上下文来模拟相同的内容。按照下面的代码:

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());
    }
}

我试图确定这两个类之间的关系。这不是继承,因为外部类的私有方法可以在内部类中访问。由于内部类的对象保存在外部类中,因此看起来有点关联关系。

【问题讨论】:

  • 至少对于 Ear 来说,它显然是 Composition,因为 Human 可以完全控制其生命周期。
  • 是的,在 UML 术语中,人眼和人耳关系都是聚合类型 = 复合的关联。
  • @www.admiraalit.nl 由于Eye 是具有公共构造函数的公共,因此另一个类可能会获得它自己的实例。那会违反构图。
  • 很高兴看到公众的眼睛。你能借我一只眼睛吗?在德语中,“借给我你的耳朵”很常见(请听我说)。所以这可能是来自不同文化的实现;-)
  • @MarkoTopolnik。不。如果 Human 端的多重性为“0..1”,则可能存在不包含在任何 Human 实例中的 Eye-instances。

标签: java uml relationship inner-classes class-diagram


【解决方案1】:

根据UML规范11.4.3.1

类充当其范围内定义的各种分类器的命名空间,包括类。嵌套分类器是包含类的命名空间的成员。分类器嵌套用于信息隐藏。

因此,在您的情况下,眼睛和耳朵嵌套在人类中。不幸的是,规范没有为类提供嵌套运算符。您可以将它们显示在额外的隔间中(UML 在您可以在除 4 个强制之外的隔间中呈现什么方面留下了很大的灵活性),就像为组件的嵌套类所建议的那样(参见 11.6.5,尤其是图 11.45)。您最终还可以考虑一个特定于包的符号,即在嵌套包(在您的情况下是人类方面)的圆圈中带有加号的线。这在 12.2.5,尤其是图 12.5 中有所介绍。但是请注意,从形式上讲,第二种表示法仅适用于包,而不适用于类。

【讨论】:

  • 优秀的答案。我认为“最终”这个词在这里被滥用了。您的意思是“另类”吗?
  • 不,我的意思是“最终”,因为这个符号是正式为包定义的,问题是关于类的。每当规范不够明确时,我尝试只使用轻微的鼓励。至少在我看来,在当前的规范阶段,“替代”会有点强。无论如何 - 感谢您的信任。
  • 好吧,英语不是我的母语,但我把“最终”读作“经过很长时间”/“当你终于来了”,而不是“可能,如果你真的需要的话”到”。
  • 我也不是,我什至不太确定这种用法是否正确,但是我找不到比这更好的了。我想要达到的意思是“这是一种可能但不鼓励(不受支持)的替代方案”。
猜你喜欢
  • 2013-01-14
  • 1970-01-01
  • 1970-01-01
  • 2023-01-24
  • 2013-04-26
  • 1970-01-01
  • 1970-01-01
  • 2014-01-26
  • 1970-01-01
相关资源
最近更新 更多