你如何模拟多态性& UML中的实例?

时间:2014-02-26 18:41:45

标签: oop uml

我发现在UML中模拟多态和实例很困难。

例如,如果我有一个名为“Bird”的抽象,父类或基类,我想你可以说“duck”是多态的一种形式,但它也可以是一个实例。

也许,我在开始和结束的地方都很困惑。有这些视觉例子吗?

3 个答案:

答案 0 :(得分:2)

继承与实例的问题取决于功能。如果您的数据模型在鸭子和其他类型的鸟类之间存在任何差异,那么您需要一个继承自Duck的{​​{1}}类。否则,你只是将你的鸭子视为Bird的一个实例。

当您在不同的Bird实现中调用相同的方法时,多态性才会发挥作用。

对于UML建模,这里有几点可以帮助你。

这本书是许多软件工程课程必读的内容,并且多年来一直很好用。

http://www.amazon.com/UML-Distilled-Standard-Modeling-Language/dp/0321193687

此博客可以很好地显示不同的用例和相应的OOP模型。 http://usna86-techbits.blogspot.com/2012/11/uml-class-diagram-relationships.html

答案 1 :(得分:2)

这很简单。

如果一个具体的类Cage引用了抽象类Bird,并且具体类Woodpecker和Canary是从最后一个派生的,那么这就是多态性。你必须选择那只鸟真正坐在笼子里,因为抽象类没有实例。接口也一样。

enter image description here

答案 2 :(得分:1)

首先,我认为您的问题是如何建模多态性。为了说明,请参阅以下Java代码:

<强> Drawable.java

package examples.simple.model;

public interface Drawable {
    public void draw();
}

<强> Shape.java

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

package examples.simple.model;

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

<强> Circle.java

package examples.simple.model;

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

<强> Line.java

package examples.simple.model;

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

<强> Plotter.java

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

这些是多态性的经典例子。类图是

enter image description here

在这种情况下,使用序列图,多态调用由保护条件控制的多个场景建模。因此,对于每个多态方案,动态绑定(多态调用)表示为“方案框”。因此,这是一个显示多态调用的单一模型(序列图)。

Sequence Diagram to represent polymorphic scenarios

最后,使用UML表示多态调用实际上是一个挑战。