zoukankan      html  css  js  c++  java
  • 对象模型图【OMD】阅读指南(转)

    补充几个名词概念:
    UML:Unified Modeling Language 统一建模语言,是用来对软件密集系统进行可视化建模的一种语言。UML为面向对象开发系统的产品进行说明、可视化、和编制文档的一种标准语言。
    OMD:Object model diagrams 对象模型图表。

    首先来看看OMD能帮我们做什么?
    1. 该类支持哪些接口;
    2. 完成任务需要哪些对象;
    3. 如何使用该类的对象;
    4. 是否可以直接实例化类;
    5. 接口有哪些方法和属性;
    6. 是否有其它类也支持该接口;
    7. 对象间的关系

    下面图示中,便是贯穿本书的对象模型图的钥匙。

    这些符号是基于UML 画图工具创建的,UML 符号是面向对象分析和设计的工业图样标准。

    对象模型图中提供的信息非常多,是对象浏览器中信息的重要补充。Visual Basic,或者其它的开发环境,都会列出所有的类和成员,但不会指明这些类之间的关系。所以,对象模型图是非常有利于读者对ArcInfo 组件的理解的!

    本书使用UML 来描述ArcInfo 组件,即ArcObjects,并描述你能够创建的数据模型。

    以下详细说明。

    1. 类和对象

    在UML 图中有三种类型的类:抽象类(abstract class)、可创建类(createable class)与可实例化类(instantiable class)。

    抽象类不能用以创建新对象,但可以用来指定子类。举个例子,“line”(线)是“primaryline”(干线)和“secondary line”(副干线)的抽象类。

    可创建类指的是那些你能够直接使用开发环境中的对象定义语法来创建对象。比如在Visual Basic 中是这样书写:Dim As New <object> 或者CreateObject <object>。

    可实例化类不能够直接创建新对象,但是这种类的对象能够作为其它对象的属性被创建或是从其它类的方法中创建。------比较难理解。

    2. 关联

    在抽象类、可创建类和可实例化类之间,有几种存在的关联(或称关系)。

    联系(association)便描述了类之间的关联。在两端的类中可以定义多重性( Multiplicity)关联。

    在这张图上,一个业主能有拥有一块或多块宗地;同样地,一块宗地可以被一个或多个业主所共有。

    多重性关联就是限制对象类与其它对象关联的数目关系。以下是用于多重性关联的符号:

    1 —— 一个并且只有一个,这种多样性是可选的;如果不标明,则默认为“1”
    0..1 —— 零个或一个
    M..N —— 从M 到N(正整数)
    *或者0… * —— 从零到任意正整数
    1… * —— 从一到任意正整数

    类继承(type inheritance)定义了专门的类,它们拥有超类的属性和方法,并且同时也有自身的属性和方法。

    上图说明primary line 和secondary line 是line 的一种类型。

    实例化(Instantiation)指定一个类的对象有这样的方法,它能够创建另外一个类的对象。

    pole 对象有一个方法能够创建transformer 对象。

    聚合(Aggregation)是一种不对称的关联方式,在这种方式下一个类的对象被认为是一个“整体”,而另一个类的对象被认为是“部件”。

    一个transformer bank 正好有3 个transformer 。在这个图中transformer 能和一个transformer bank 相关联,但当transformer bank 移除以后,transformer 依然能够存在。

    组成(Composition)是一种更为强壮的聚合方式,此种方式下,“整体”对象控制着“部分”对象的生存时间。

    一个pole 包含一个或多个crossarm。在这个图中当pole 被移除后,crossarm 就不能再使用了。因为pole 控制着crossarm 的生存时间。

    在安装完AE后,我们就可以在相关目录中找到AE的OMD图,
    一般在 安装目录\DeveloperKit\Diagrams下
    下为ArcEngine中OMD的截图:

    其中
    OMD中的符号
    一个三角形符号 表示继承
    菱形的黑色小块 表示组成
    虚线前头带个箭头 表示用来创建
    * 表示对应关系1:N
    一条直线表示 联合

    类的类别:
    抽象类:不能创建或实例化,从来没有一个抽象类的实例
              用于定义子类的公共接口,子类继承其定义的接口。
              OMD符号为:二维的内部有阴影的矩形。
    实例化类:不能创建,从别的对象获得实例。
              OMD符号为:3D矩形内部没有阴影。
    可创建的类:用New关键字创建对象或者从别的对象获得运行实例。
              OMD符号为:带阴影的3D矩形符号。

    属性和方法:
    属性:哑铃状的图标,Read(左侧的哑铃)和write(右侧的哑铃)
    方法:指向左侧的箭头
    接口:棒棒糖类型的图标
    图表之间的连接:虫洞

    ===========================
    个人感觉在OMD图中比较难理解的就是可实例化类CLASS。我做了以下例子去理解它:

    ArcEngine中 workSpace 就是一个可实例化类,
    WorkSpace不能用new创建,但可以通过WorkSpaceFarctory.Openfromfile()方法来创建.如下:

    IWorkspaceFactory pWorkspaceFactory = new AccessWorkspaceFactoryClass();
    IWorkspace pWorkspace = pWorkspaceFactory.OpenFromFile(ConnectionString, 0);

    但当我们尝试用New去创建一个Workspace类时,如下:

    IWorkspace pWorkspace = new WorkspaceClass();
    就会出现以下错误:
    “类型”ESRI.ArcGIS.Geodatabase.WorkspaceClass未定义构造函数;

    所以,Class和CoClass的主要区别就是CoClass是带构造函数的Class.以此它可以用New直接创建对象

  • 相关阅读:
    Linux块设备IO子系统(二) _页高速缓存
    Linux块设备IO子系统(一) _驱动模型
    Linux usb子系统(二) _usb-skeleton.c精析
    Linux usb子系统(一) _写一个usb鼠标驱动
    Linux i2c子系统(四) _从i2c-s3c24xx.c看i2c控制器驱动的编写
    Linux i2c子系统(三) _解决probe无法执行
    Linux i2c子系统(二) _通过i2c-dev.c访问设备的方法
    Linux i2c子系统(一) _动手写一个i2c设备驱动
    从0移植uboot(六) _实现网络功能
    从0移植uboot(五) _实现串口输出
  • 原文地址:https://www.cnblogs.com/zyf7630/p/1577298.html
Copyright © 2011-2022 走看看