组件的继承
前面实现的将C#组件组合进VB工程中只是牛刀小试,现在我们来实现混合语言的面向对象编程(OOP),首先,我们来尝试一下混合语言组件的继承。
新建一个VB类库工程VBComponent,在工程中按上面的方法添加对CSharpClass.dll组件的引用,然后组件中增加一个新类:ExtendsFromCSharp,它继承自C#类CSharpClass,ExtendsFromCSharp类提供一个Add(x,y)方法,将两数相加,用UML表示如图4:
<shapetype id="_x0000_t75" stroked="f" filled="f" path="m@4@5l@4@11@9@11@9@5xe" o:preferrelative="t" o:spt="75" coordsize="21600,21600"><stroke joinstyle="miter"></stroke><formulas><f eqn="if lineDrawn pixelLineWidth 0"></f><f eqn="sum @0 1 0"></f><f eqn="sum 0 0 @1"></f><f eqn="prod @2 1 2"></f><f eqn="prod @3 21600 pixelWidth"></f><f eqn="prod @3 21600 pixelHeight"></f><f eqn="sum @0 0 1"></f><f eqn="prod @6 1 2"></f><f eqn="prod @7 21600 pixelWidth"></f><f eqn="sum @8 21600 0"></f><f eqn="prod @7 21600 pixelHeight"></f><f eqn="sum @10 21600 0"></f></formulas><path o:connecttype="rect" gradientshapeok="t" o:extrusionok="f"></path><lock aspectratio="t" v:ext="edit"></lock></shapetype>
![]()
图 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。
现在,我们就实现了基于组件的以下面向对象系统设计:
![]()
新建一个使用VB的Windows应用程序,在工程中加入对以上两个组件库的引用,往窗体上加入一个按钮,在其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
经过测试,跨语言、跨组件的多态的确可以正常地动作。
好了,现在让我们好好想想都实现了什么东西,可以怎样应用到开发实践中:
我们可以将某个接口封装到一个组件中,然后,具体实现这个接口的类我们可以放到不同的组件中,交给不同的程序员以他们所喜爱的语言来开发。使用这些组件的程序员只要在他的代码中始终使用接口变量而不是具体类的变量,我们就可以动态地替换掉某个具体的实现接口的组件,而不会影响使用这些组件的程序。
哇,这不就意味着我们可以把一个完整的软件系统给大卸八块,然后根据具体情况选一个组件插入系统?太棒了!下面,就让我们来开始进行组件化编程最精彩之旅---软件组件的动态装配与插拔。
分享到:
相关推荐
COM组件的技术优势也是明显的,在很大的程度上实现了Windows平台下的代码复用,所以我们才会提出这样的一个话题,如何才能在.NET技术日臻成熟的情况下,保护和利用已经存在的大量的采用COM技术的软件和产品呢?...
【ASP.NET编程知识】详解高效而稳定的企业级.NET Office组件Spire 在现代软件开发中,尤其是企业级的业务系统,文档操作是一个不可或缺的部分。为了提高效率和减轻用户的工作负担,开发者需要找到能够方便地创建、...
.NET组件技术是微软开发平台中的核心部分,它允许开发者创建可重用的代码模块,以构建高效、可扩展的应用程序。这些组件可以是类库、服务或者任何具有独立功能的软件单元,它们能够无缝地集成到.NET框架中,提供跨...
2. **.NET Framework**:这是一个由微软开发的软件框架,包含了执行环境和一套全面的类库,支持多种编程语言,如C#、VB.NET等。.NET Framework为开发者提供了丰富的API,使得构建OCR组件成为可能。 3. **OCR...
.NET组件编程是开发ASP.NET应用时的关键技术,它涉及到组件(Component)和控件(Control)的创建。...理解并掌握这些知识,将有助于提升你的.NET开发能力,使你能够创建出高效、可复用且用户友好的软件组件。
HxDataPage多功能.Net翻页组件,使用简单,功能强大。 提供"首页","上一页","下一页","末页","转到"及多种显示标签,操作灵活方便。 灵活控制按钮或标签显示或隐藏,适应多种数据翻页要求。 采用ole技术,支持...
本书籍详细解答了使用.NET进行组件编程时可能遇到的技术难题,提供了丰富的示例和实践指导,是提升.NET开发能力的重要资源。通过学习这些知识,开发者能够构建更高效、可靠和可扩展的软件系统。
综上所述,.NET QRCode二维码生成组件是一个功能强大的工具,它涵盖了二维码编码规范、错误纠正、图像生成等多个技术点。通过源码学习,开发者不仅可以创建自己的二维码生成应用,还可以深入了解.NET编程和二维码...
2. **.NET Framework**: .NET Framework是微软开发的一个软件框架,它包含了执行.NET应用程序所需的所有基础设施,包括Common Language Runtime (CLR) 和类库。在这个组件中,.NET Framework提供了运行环境和支持,...
在.NET平台上,组件是软件开发的核心,它们可以作为独立的功能单元被其他应用程序所使用,极大地提高了开发效率和代码质量。 首先,书中讲解了.NET组件的基础知识,包括COM+服务、接口(Interface)、抽象类...
《.NET软件架构之美(第2版)》是一本深入探讨.NET平台上的...通过《.NET软件架构之美(第2版)》,读者不仅能掌握.NET平台的架构设计技巧,还能了解到最新的技术趋势和最佳实践,提升在复杂企业级项目中的架构设计能力。
总的来说,ASP.NET 2.0 AJAX组件安装软件集合是一个不可或缺的开发资源,它简化了在ASP.NET环境中使用AJAX技术的过程。通过掌握这些组件和工具,开发者能够创建更加动态和高效的Web应用程序,提供更优秀的用户体验。...
通过《.NET测试实战技术大全》的源代码实例,读者可以亲自动手实践这些测试技术,加深理解,并将所学应用到实际项目中,提高软件的质量和可靠性。书中涵盖的测试策略和技巧对于任何.NET开发者来说都是宝贵的财富。
这个标签明确了讨论的焦点是关于.NET环境下的组件源代码,可能涵盖了各种.NET技术,如C#、VB.NET、F#等语言编写的组件。这些组件可能包括Windows Forms控件、ASP.NET MVC模块、WCF服务、Entity Framework数据访问层...
2. **ADO.NET(和LINQ)**:ADO.NET是.NET框架中处理数据库访问的关键部分,允许开发者高效地与各种数据源交互。LINQ(Language Integrated Query)是.NET Framework的一部分,它使得查询数据变得更加自然和直观,...
《Microsoft .NET程序设计技术内幕》是一本深入探讨.NET框架编程技术的专业书籍,英文原版以CHM(Compiled Help Manual)格式提供,旨在为开发者提供详尽的.NET平台开发知识。.NET程序设计是现代软件开发中的关键...
【极致业务基础平台(Jeez Business Framework,JBF)】是基于Microsoft .NET开发技术构建的一款高效能的管理软件快速开发平台。JBF的核心设计理念是模型驱动架构,旨在简化和加速业务应用软件的开发、实施和维护,...
### 基于.NET的通用查询组件的开发 #### 概述 在当前的信息时代,数据库查询成为了大多数软件系统中的核心功能之一。...未来随着.NET技术的不断发展和完善,此类通用组件将在更多的应用场景中发挥重要作用。