转至繁体中文版     | 网站首页 | 图文教程 | 资源下载 | 站长博客 | 图片素材 | 武汉seo | 武汉网站优化 | 
最新公告:     敏韬网|教学资源学习资料永久免费分享站!  [mintao  2008年9月2日]        
您现在的位置: 学习笔记 >> 图文教程 >> 软件开发 >> VB.NET程序 >> 正文
VB.Net中文教程(11) Prototype样式         ★★★★

VB.Net中文教程(11) Prototype样式

作者:闵涛 文章来源:闵涛的学习笔记 点击数:1519 更新时间:2009/4/23 19:01:10

请注意 ......
著作权所有人:物泽计算机事业股份有限公司、
              MISOO对象技术顾问团队、对象导向杂志作者、等。
u本文件摘自 对象导向杂志、精通对象观念与技术等书籍著作。
u本文件仅供您的参阅,请遵守著作权法,不得做其它商业用途。

 


主题:       Prototype样式
副题:      多形性、接口(Interface)     


?????????  内容  ?????????
v 1. 样式
v 2. 对象之原型(object prototype)
v 3. 以VB落实Prototype样式
v 4. Prototype样式之应用----- 组件之设计与组装


1. 样式
    Erich Gamma 等人的名著──"Design Patterns: Elements of Reusable Object-Oriented Software" 含有23个重要的设计样式(design pattern)。顾名思义﹐「样式」就是大家可「有样学样﹐依样画葫芦」﹐并一而再、再而三地在不同场合﹐重复使用(reuse) 它来解决常见之问题。
    样式必须常常使用﹐且愈纯熟愈好﹐才能随外界环境(context) 而加以变化﹐才能确实解决问题(problem) 。像孙子兵法、太极拳法皆含有许多样式(或称为招式)﹐必须心领神会﹐并实际练习之﹐才能达到炉火纯青之地步。其主要原因是﹕单一样式(招式)常只解决个小问题﹐而大问题可能需要多种样式混合使用才行。如何将小样式组合成为大样式来解决大问题呢﹖这常需一套完整的法则(rule)﹐通称为「样式语言」(pattern language)。本文引用Gamma书中的Prototype样式﹐说明如何以VB的接口来实作之,也让您更能善用多形性观念。以下就请您仔细看如何使用Prototype 样式了。

 
                  图1、Prototype样式的UML图


2. 对象之原型 (object prototype)
    人们日常生活中﹐常见下述说法﹕

           「我要养一只像加菲猫一样的猫」
           「我将来要娶个美如西施的妻子」
            ......

其中﹐加菲猫和西施皆是prototype (或译为范例)。当您说上述两句话时﹐听者立即能经由prototype 对象(即加菲猫或西施)来了解您心中所欲描述之新对象。在软件方面﹐使用者可藉prototype 来告诉计算机﹕

           「我要的对象就像这个prototype 对象」

于是﹐计算机依该prototype 对象来造出一模一样的新对象给使用者。
    回想﹐我们所熟悉的VB、C#、Java或C++语言中﹐皆是借着「类别」来描述对象之特性﹐然后计算机则依类别之描述来造出新对象。这种就通称为class-based programming ﹔而前者称为prototype-based programming 。
    随着﹐软件零组件(sofrware IC) 观念的流行﹐prototype-based programming 观念也愈来愈重要了。既使像VB语言﹐也能支持prototype-based programming 。


3. 以VB落实Prototype样式
     上图1是Gamma书中所列出的prototype样式。下图2则是个实际的例子。

       
                   图2、绘图对象的Prototype

    对象设计者从Shape衍生出Circle及Rectangle两类别,并各诞生1个prototype对象,且存入ShapeList串行或数组之中。设计者必须为各类别定义Clone( )函式来诞生新对象,并构成多形性。于是对象装配者只需呼叫Clone( )函数就能获得新对象,而不必具有类别观念。未来,设计者可从Shape类别衍生出许许多多子类别,并把对象放入ShapeList中,供装配者使用。
    兹看看如何以VB来落实上图2的UML模式:

''''ex01.bas
Imports System.ComponentModel
Imports System.Drawing
Imports System.WinForms
''''-------------------------------------------------------------------------
Class Shape
    Protected lx, ly As Integer
    Public Sub SetXY(ByVal x As Integer, ByVal y As Integer)
        lx = x
        ly = y
    End Sub
    Public Overridable Sub Draw()
    End Sub
    Public Overridable Function Clone() As Shape
    End Function
End Class

Class Circle
    Inherits Shape
   
    Public Overrides Sub Draw()
        MessageBox.Show("Drawing a Circle at (" + str(lx) + ", " + str(ly) + ")")
    End Sub
    Public Overrides Function Clone() As Shape
        Clone = New Circle()
    End Function
End Class

Class Rectangle
    Inherits Shape
   
    Public Overrides Sub Draw()
        MessageBox.Show("Drawing a Rectangle at (" + str(lx) + ", " + str(ly) + ")")
    End Sub
    Public Overrides Function Clone() As Shape
        Clone = New Rectangle()
    End Function
End Class
''''-------------------------------------------------------------------------------------
Class ShapeList
    Private tlist(10) As Shape
    Private counter As Integer
   
    Public Sub New()
        counter = 0
    End Sub
    Public Sub AddShape(ByVal sobj As Shape)
        tlist(counter) = sobj
        counter = counter + 1
    End Sub
    Public Function GetShape(ByVal i As Integer) As Shape
        GetShape = tlist(i)
    End Function
    Public Sub Draw()
        Dim i As Integer
        For i = 0 To counter - 1
            tlist(i).Draw()
        Next
    End Sub
End Class
''''-------------------------------------------------------------------------------------
Public Class Form1
    Inherits System.WinForms.Form
    Public Sub New()
        MyBase.New()
        Form1 = Me
        ''''This call is required by the Win Form Designer.
        InitializeComponent()
        ''''TODO: Add any initialization after the InitializeComponent() call
    End Sub
    ''''Form overrides dispose to clean up the component list.
    Public Overrides Sub Dispose()
        MyBase.Dispose()
        components.Dispose()
    End Sub
#Region " Windows Form Designer generated code "
     ......
#End Region
    Protected Sub Form1_Click(ByVal sender As Object, ByVal e As System.EventArgs)
        Dim list As New ShapeList()
        Dim ps As Shape
        ps = New Circle()
        ps.SetXY(10, 10)
        list.AddShape(ps)
       
        ps = New Rectangle()
        ps.SetXY(50, 50)
        list.AddShape(ps)
       
        ps = list.GetShape(0).Clone()
        ps.SetXY(230, 70)
        list.AddShape(ps)
       
        list.Draw()
    End Sub
End Class

此程序输出:
               Draw a Circle at (10, 10)
               Draw a Rectangle at (50, 50)
               Draw a Circle at (230, 70)

   ShapeList类别属于Client,在设计ShapeList类别时,只能用到Shape类别的信息而已;在Client(如上述的Form1类别)里,除了诞生对象时使用到Circle和Rectangle类别名称之外,也只能用到Shape类别的信息而已;这让我们未来能不断扩充更多子类别,如Square、Triangle等等。为了达到此高度扩充性,需要用到多形性(polymorphism)观念。所以Shape类别里建立了多形的基础:

         Public Overridable Sub Draw()
         End Sub
         Public Overridable Function Clone() As Shape
         End Function
    Draw( )和Clone( )皆是虚拟(virtual)程序,以发挥多型(polymorphism)功能。lx及ly是图形的左上角坐标。SetXY( )可改变lx及ly值。ShapeList类别的Draw程序用来绘出串行中的各prototype对象图。
    VB的父类别(superclass)有两种角色:
        1) 提供一些程序给子类别继承
        2) 作为各子类别的共同接口(Interface)

上述程序是两者合一的落实途径。如果您落实到分布式(Distributed)环境里,则宜将上述两项角色分离并各别落实之。此时必须使用VB的Interface机制了。例如上述程序相当于:

''''ex02.bas
Imports System.ComponentModel
Imports System.Drawing
Imports System.WinForms
''''----------------------------------------------------
Interface IShape
    Sub Draw()
    Function Clone() As IShape
    Sub SetXY(ByVal x As Integer, ByVal y As Integer)
End Interface

Class Shape
    Protected lx, ly As Integer
    Protected Sub SetXY(ByVal x As Integer, ByVal y As Integer)
        lx = x
        ly = y
    End Sub
End Class

Class Circle
    Implements IShape
    Inherits Shape
   
    Public Sub Draw() Implements IShape.Draw
        MessageBox.Show("Drawing a Circle at (" + str(lx) + ", " + str(ly) + ")")
    End Sub
    Public Function Clone() As IShape Implements IShape.Clone
        Clone = New Circle()
    End Function
    Public Sub SetValue(ByVal x As Intege

[1] [2]  下一页


[网页制作]用 prototype 定义自己的方法  [Web开发](Javascript)prototype的一个优势也是缺点
[Web开发]JavaScript中的prototype(原型)属性研究  
教程录入:mintao    责任编辑:mintao 
  • 上一篇教程:

  • 下一篇教程:
  • 【字体: 】【发表评论】【加入收藏】【告诉好友】【打印此文】【关闭窗口
      注:本站部分文章源于互联网,版权归原作者所有!如有侵权,请原作者与本站联系,本站将立即删除! 本站文章除特别注明外均可转载,但需注明出处! [MinTao学以致用网]
      网友评论:(只显示最新10条。评论内容只代表网友观点,与本站立场无关!)

    同类栏目
    · C语言系列  · VB.NET程序
    · JAVA开发  · Delphi程序
    · 脚本语言
    更多内容
    热门推荐 更多内容
  • 没有教程
  • 赞助链接
    更多内容
    闵涛博文 更多关于武汉SEO的内容
    500 - 内部服务器错误。

    500 - 内部服务器错误。

    您查找的资源存在问题,因而无法显示。

    | 设为首页 |加入收藏 | 联系站长 | 友情链接 | 版权申明 | 广告服务
    MinTao学以致用网

    Copyright @ 2007-2012 敏韬网(敏而好学,文韬武略--MinTao.Net)(学习笔记) Inc All Rights Reserved.
    闵涛 投放广告、内容合作请Q我! E_mail:admin@mintao.net(欢迎提供学习资源)

    站长:MinTao ICP备案号:鄂ICP备11006601号-18

    闵涛站盟:医药大全-武穴网A打造BCD……
    咸宁网络警察报警平台