Oop 如何建模多态性&;UML中的实例?

Oop 如何建模多态性&;UML中的实例?,oop,uml,Oop,Uml,我发现很难用UML建模多态性和实例 例如,如果我有一个名为“Bird”的抽象类、父类或基类,我可以想象你可以说“duck”是多态性的一种形式,但它也可以是一个实例 也许,我搞不清楚一个人从哪里开始和结束。有这些的视觉例子吗 继承与实例的问题取决于功能。如果ducks和其他类型的Bird之间的数据模型存在任何差异,那么您需要一个继承自Bird的Duck类。否则,您将鸭子视为鸟的一个实例 只有在不同的Bird实现中调用相同的方法时,多态性才会起作用 对于UML建模,这里有两点可以帮助您 这本书是许多

我发现很难用UML建模多态性和实例

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


也许,我搞不清楚一个人从哪里开始和结束。有这些的视觉例子吗

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

只有在不同的
Bird
实现中调用相同的方法时,多态性才会起作用

对于UML建模,这里有两点可以帮助您

这本书是许多软件工程课程的必读书,多年来一直为我服务

这个博客很好地展示了不同的用例和相应的OOP模型

这很简单

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


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

Drawable.java

package examples.simple.model;

public interface Drawable {
    public void draw();
}
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;
    }
}
package examples.simple.model;

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

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

public class Line implements Drawable{
    public void draw() {
        System.out.println("Drawing a line");
    }
}
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();
        }
    }
}
Shape.java

package examples.simple.model;

public interface Drawable {
    public void draw();
}
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;
    }
}
package examples.simple.model;

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

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

public class Line implements Drawable{
    public void draw() {
        System.out.println("Drawing a line");
    }
}
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();
        }
    }
}
Rectangle.java

package examples.simple.model;

public interface Drawable {
    public void draw();
}
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;
    }
}
package examples.simple.model;

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

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

public class Line implements Drawable{
    public void draw() {
        System.out.println("Drawing a line");
    }
}
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();
        }
    }
}
Circle.java

package examples.simple.model;

public interface Drawable {
    public void draw();
}
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;
    }
}
package examples.simple.model;

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

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

public class Line implements Drawable{
    public void draw() {
        System.out.println("Drawing a line");
    }
}
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();
        }
    }
}
Line.java

package examples.simple.model;

public interface Drawable {
    public void draw();
}
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;
    }
}
package examples.simple.model;

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

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

public class Line implements Drawable{
    public void draw() {
        System.out.println("Drawing a line");
    }
}
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();
        }
    }
}
Plotter.java

package examples.simple.model;

public interface Drawable {
    public void draw();
}
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;
    }
}
package examples.simple.model;

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

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

public class Line implements Drawable{
    public void draw() {
        System.out.println("Drawing a line");
    }
}
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();
        }
    }
}
package examples.simple.client;
导入java.util.ArrayList;
导入java.util.List;
导入示例.simple.model.Circle;
导入示例.simple.model.Drawable;
导入examples.simple.model.Rectangle;
导入examples.simple.model.Shape;
导入examples.simple.model.Line;
类绘图仪{
公共静态void main(字符串[]args){
List drawables=new ArrayList();
形状s=新圆();
可提取。添加(s);
s=新矩形();
可提取。添加(s);
第l行=新行();
增加(1);
用于(可提取:可提取){
draw();
}
}
}
这是多态性的一个经典例子。类图是

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


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

否决我的问题是可以的,但如果你不告诉我为什么,我不知道为什么,我可能无法纠正我的问题。类图不能捕获实例。鸭子可能是一种鸟,麦夸克先生可能是一种特殊的鸭子。当然,可能会选择不将鸭子建模为单独的关系,这取决于范围/任务-基本上,一小部分有限的原型可以建模为类,而未绑定的数据集合只能由所述关系的“实例”表示。@user2864740类图没有实例作为元素,但它可以间接地谈论它们——抽象类或接口没有实例,而具体类有实例。谢谢Babak。你能在你引用的继承和实例的例子中给出多态性的例子吗?对不起。我不太明白。所以你的意思是说金丝雀不是鸟的一个例子,而是它代表了多态性。那么什么时候是一个实例呢?我的理解是金丝雀将是一个实例,它的行为(例如声音)将是多态性的。@PeanutsMonkey金丝雀不是任何事物的实例,它是类。这里没有实例。您只能看到可以或不能有实例的类。金丝雀源于抽象类Bird。班上的金丝雀也可以有这样的例子——那些唱着黄色歌曲的小动物。谢谢Gangnus。所以它是泛化或专门化。这如何等同于实例和多态性?@PeanutsMonkey Bird不能有实例,但Cage有Bird,因此必须用它代替金丝雀或啄木鸟来获得实例。“这就是多形性。@PeanutsMonkey,那么,你有一个类笼子,里面可以是金丝雀XOR啄木鸟。