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