bitfan(数字世界一凡人)的专栏

在新浪博客的新家:http://blog.sina.com.cn/bitfan

用户操作
[即时聊天] [发私信] [加为好友]
bitfan(数字世界一凡人)ID:bitfan
375528次访问,排名142好友0人,关注者65
=========
一名代码一写就十多年的“老古董级程序员”,看来还会再写下去;
一名有着“好为人师”臭毛病的小小讲师,“混迹于”大学校园,时不时发几句不合时宜的“反动言论”,好在皮厚,任人笑骂而无所谓;
于北京高楼林立之地租一小屋容身,依靠讲几节小课赚点小课时费应付房东大妈,所幸政府开恩照顾,终于让我等穷教师有了当房奴的资格,高呼:感谢政府!
==========
几本小书:
《网站建设教程》:高等教育出版社(2005)
《编程的奥秘——.NET软件技术学习与实践》:电子工业出版社(2006)
《.NET 2.0面向对象编程揭秘》:电子工业出版社(2007)。
《ASP.NET程序设计教程》高等教育出版社(2009)。

几堂小课:
在ITCAST(http://www.itcast.net)讲授.NET系列在线视频课程,想将课堂开到互联网上,目标不大,要帮助更多的年轻人学好技术找到好工作。野心不小,已录制了5个系列30节课,打算一路跟踪微软最新技术,打造国内自成体系、独特风格的微软技术系列课程。
bitfan的文章
原创 87 篇
翻译 0 篇
转载 0 篇
评论 2214 篇
最近评论
vxbb_free:楼上的说的吓人了
vxbb_free:楼上的说的吓人了
wjfmail:可以学,但估计要比别人多很多的努力.毕竟开发不是一种天赋就可以拥有的才能.你碰的钉子会比别人多得多.不过,还是从现在开始努力吧.
gsqswjh:我就是小学文化,而且"奔四"了,才开始学习编程,学如逆水行舟,不进则退,说的太对了,加油啊!
Microsoft_China_Vip:


www.soAsp.net 编程学习网 技术+ 实例应用 讲解不错。 推荐大家!

有很多 技术资料也很好!



文章分类
收藏
    相册
    .NET技术学习与实践
    5.2 使用.NET开发数据库应用程序
    数据绑定原理
    杂类
    存档
    订阅我的博客
    XML聚合  FeedSky
    订阅到鲜果
    订阅到Google
    订阅到抓虾
    订阅到BlogLines
    订阅到Yahoo
    订阅到GouGou
    订阅到飞鸽
    订阅到Rojo
    订阅到newsgator
    订阅到netvibes

    原创 .NET软件组件技术(2)收藏

    新一篇: 基于组件的.NET软件开发(3) | 旧一篇: 基于组件的.NET软件开发(1)

    组件的继承

           前面实现的将C#组件组合进VB工程中只是牛刀小试,现在我们来实现混合语言的面向对象编程(OOP),首先,我们来尝试一下混合语言组件的继承。

          新建一个VB类库工程VBComponent,在工程中按上面的方法添加对CSharpClass.dll组件的引用,然后组件中增加一个新类:ExtendsFromCSharp,它继承自C#类CSharpClassExtendsFromCSharp类提供一个Add(x,y)方法,将两数相加,用UML表示如图4


    4 C#类继承而来的VB

    具体代码如下:

     

    Imports CSharpClassNameSpace.CSharpClass

    '继承自C#组件中的类CSharpClass

    Public Class ExtendsFromCSharp

        Inherits CSharpClassNameSpace.CSharpClass

        Public Function Add(ByVal x As Integer, ByVal y As Integer) As Long

            Return x + y

        End Function

    End Class

     

        编译生成VBComponent.DLL组件(至于如何使用和测试这个类,就不用我多说了吧?)。

        现在,VBComponent组件中的ExtendsFromCSharp类将拥有两个方法:SaySomething来自C#基类CSharpClass,而Add()函数则由VB实现。你创建的ExtendsFromCSharp类对象居然组合了两种不同语言开发的功能,你甚至不知道这些方法和函数是由哪种语言开发的,是不是很神奇?

        让我们稍微休息一会,进行一个小结:

    *      现在我们已掌握了从现成的组件中派生新类的方法,这就是说,我们可以建立自己的组件库,并在合适的时候动态地扩展它,这种扩展是跨语言的。

    *      VS.NET中使用混合语言组件时,当所使用的组件修改过后,注意需要动态地更新工程引用。方法是重新生成解决方案,或者是删除原有引用后再重新加入工程。

    *      由于组件间相互继承,这就造成了组件库之间的依赖性(比如VBComponent.DLL组件就依赖于CSharpClass.DLL),因此,在实际项目开发中,任何一个项目小组成员所开发的组件库,都要求在文档中声明其组件库依赖性。另外,在系统开发完成部署到用户计算机上时,相互依赖的组件库必须绑在一起同时复制到用户计算机上,不能只提供一个。

     

        下面,让我们走得更远一些,在组件间实现多态!

    组件间的多态调用

        我们来实现一个“经典”的多态例子,它说明以下事实:圆和矩形都是几何图形,都可以求面积。

        继续上面的例子,在C# 工程中选定原先的CSharpClass.cs文件,在类CSharpClass之外,输入以下代码:

     

         public interface IMyShape

         {

             double Area();

         }

         public class CSharpRect :IMyShape

         {

             public float width;

             public float height;

           

             public double Area()

             {

                  return width*height;

             }

         }

       

        很明显,在这里我们定义了一个接口IMyShape,类CSharpRect实现了这个接口,它对接口所定义的求面积的函数double Area()提供了自己的实现:

                    矩形面积=*

        编译生成解决方案,CSharpClass.DLL得到更新。

        打开VBComponent工程,注意到刷新此工程对CSharpClass.DLl的引用,检查方法是在选菜单:视图à对象浏览器,查看CSharpClass是否体现了新的更改,如5图所示:


    5 检查组件是否更新

         新建一个类文件VBCircle.vb,输入以下代码:

     

    Public Class VBCircle

        Implements CSharpClassNameSpace.IMyShape

     

        Private _radius As Single

     

        Property Radius() As Single

            Get

                Radius = _radius

            End Get

            Set(ByVal Value As Single)

                _radius = Value

            End Set

        End Property

     

        Public Sub New()

            _radius = 0

        End Sub

     

        Public Function Area() As Double Implements CSharpClassNameSpace.IMyShape.Area

            Return System.Math.PI * _radius * _radius

        End Function

    End Class

     

        编译,生成VBComponent.DLL

        现在,我们就实现了基于组件的以下面向对象系统设计:

     

     

        新建一个使用VBWindows应用程序,在工程中加入对以上两个组件库的引用,往窗体上加入一个按钮,在其Click事件中书写以下代码:

     

    Private Sub Button_Click() Handles Button6.Click

            Dim VBObj As New VBComponent.VBCircle()

            VBObj.Radius =10

            Dim CSharpObj As New CSharpClassNameSpace.CSharpRect()

            Dim area As Double

            CSharpObj.width = 10

            CSharpObj.height = 20

            CalArea(VBObj)

            CalArea(CSharpObj)

        End Sub

       

        其中CalArea()是一个Sub过程,它接收一个IMyShape类型的参数,可以传给它任何一个实现了IMyShape接口的对象,这种以接口而不是具体类来编定代码的方法,就是典型的多态编码方式。

     

    Private Sub CalArea(ByVal obj As CSharpClassNameSpace.IMyShape)

            MessageBox.Show(Convert.ToString(obj.Area()))

    End Sub

     

        经过测试,跨语言、跨组件的多态的确可以正常地动作。

     

        好了,现在让我们好好想想都实现了什么东西,可以怎样应用到开发实践中:

        我们可以将某个接口封装到一个组件中,然后,具体实现这个接口的类我们可以放到不同的组件中,交给不同的程序员以他们所喜爱的语言来开发。使用这些组件的程序员只要在他的代码中始终使用接口变量而不是具体类的变量,我们就可以动态地替换掉某个具体的实现接口的组件,而不会影响使用这些组件的程序。

        哇,这不就意味着我们可以把一个完整的软件系统给大卸八块,然后根据具体情况选一个组件插入系统?太棒了!下面,就让我们来开始进行组件化编程最精彩之旅---软件组件的动态装配与插拔。

    发表于 @ 2004年12月20日 23:10:00|评论(loading...)|编辑

    新一篇: 基于组件的.NET软件开发(3) | 旧一篇: 基于组件的.NET软件开发(1)

    评论:没有评论。

    发表评论  


    当前用户设置只有注册用户才能发表评论。如果你没有登录,请点击登录
    Csdn Blog version 3.1a
    Copyright © bitfan(数字世界一凡人)