首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何在单个图中可视化多态调用?

如何在单个图中可视化多态调用?
EN

Stack Overflow用户
提问于 2014-08-02 21:12:23
回答 3查看 5.1K关注 0票数 2

首先,请参阅这些Java代码:

Drawable.java

代码语言:javascript
复制
package examples.simple.model;

public interface Drawable {
    public void draw();
}

Shape.java

代码语言:javascript
复制
package examples.simple.model;

public abstract class Shape  implements Drawable {
    private Point center;

    public Point getCenter() {
        return center;
    }

    public void setCenter(Point center) {
        this.center = center;
    }
}

Rectangle.java

代码语言:javascript
复制
package examples.simple.model;

public class Rectangle extends Shape {
    public void draw() {
        System.out.println("Drawing a rectangle....");
    }
}

Circle.java

代码语言:javascript
复制
package examples.simple.model;

public class Circle extends Shape {
    public void draw() {
        System.out.println("Drawing a circle....");
    }
}

Line.java

代码语言:javascript
复制
package examples.simple.model;

public class Line implements Drawable{
    public void draw() {
        System.out.println("Drawing a line");
    }
}

Plotter.java

代码语言:javascript
复制
package examples.simple.client;

import java.util.ArrayList;
import java.util.List;

import examples.simple.model.Circle;
import examples.simple.model.Drawable;
import examples.simple.model.Rectangle;
import examples.simple.model.Shape;
import examples.simple.model.Line;

class Plotter {

    public static void main(String[] args) {
        List<Drawable> drawables = new ArrayList<Drawable>();

        Shape s = new Circle();
        drawables.add(s);

        s = new Rectangle();
        drawables.add(s);

        Line l = new Line();
        drawables.add(l);

        for (Drawable drawable : drawables) {
            drawable.draw();
        }
    }
}

这些代码是一个典型的多态例子。这些代码的类图是

当我尝试使用UML序列图来建模这些类以显示多态性时,只使用一个序列图,我需要使用四个注释来表示多态。

那么,如何在没有注释的情况下,将多态调用可视化在一个图中呢?是否还有其他符号或可视化(没有UML序列或通信关系图)来显示多态性?在本例中,如何在drawable.draw()中显示调用Plotter.main()

EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2014-08-05 03:22:48

使用工厂方法设计模式-顺序图中提出的思想,多态调用由受保护条件控制的多个场景建模。因此,对于每个多态场景,动态绑定(多态调用)表示为“场景框”。因此,这是一个显示多态调用的单一模型(序列图)。

从字面上讲,作者的文章评论了你的建模策略:

“事实证明,为了模拟操作流程,我实际上是在建模多态、后期绑定和所有这些东西是如何工作的。我想,在这种情况下,序列图不仅无关紧要,而且实际上令人困惑。但我不得不尝试。”

总之,显示多态调用是一项非常重要的任务,我认为对软件工程师来说,清楚地可视化多态性实际上是一个开放的挑战。

票数 3
EN

Stack Overflow用户

发布于 2014-08-02 21:27:15

序列图在显示交互作用方面很强,它们不太适合描述模型的结构特性。

类图可能是您所需要的。下面的图像是一个显示多态性的类图的示例(即getArea方法)。

票数 2
EN

Stack Overflow用户

发布于 2018-02-12 21:55:35

出于我在评论中的原因(每个对象都有自己的生命线,每条消息都是一个调用,等等),在一个图中尝试这样做是很困难的(如果不是不可能的和错误的话)。

此外,多态性的美妙之处在于,在一定程度上(多态调用),我们不想知道细节。对draw()的调用只起作用,而不管实现类是什么。细节隐藏在抽象中。UML图在显示基本信息时非常有用。

在您的回答中,每个形状都只接收到消息draw() (我们没有看到与序列图在行为上有任何区别)。如果您确实需要澄清Circle实现之间的差异等等,我建议在单独的图中表示多态调用,这样我们就可以看到使用了哪些不同的对象来实现draw()功能,例如:

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/25099461

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档