感受.net的跨语言特性

感受.net的跨语言特性

这段时间学习.net,在网上也找了很多的资料,发现大多的教程都在讨论着.net的技术趋势和给软件生产带来的变化.常常是简单说说.象分布计算呀,组件化呀等等,却很少有这方面的稍稍感性点的认识.对于高手来说或许这样的介绍已经是足够的了.可对于大量象我这样的初学者,其实很难能理解那分布计算.那组件化的到底代表着什么,唯一能知道的就是那是很高深的技术.

于是乎自己有了个不自量力的想法.把自己看过的东西写出来,希望能对象我这样的菜鸟对c#或者说是.net有点感性的认识,同时也让大家来批批,帮助自己进步.

.net 支持语言无关,和语言集成,你可以继承一种符合.net 公用类型系统(CTS)的语言写的类,捕获他的异常,使用跨语言的多太性.也就是说在.net环境下各种语言是可以混合使用的.你可以从完全不同的语言写成的基类派生一个类,也可以在程序里捕获用另一种语言编写的异常等等.

在本例中,我们将使用受管制的c++生成一个抽象基类human;
然后用vb.net生成一个从human派生的类woman,用c#生成一个从human派生的类man.
其结构如下:
用c++写的抽象基类:Human
他有三个多态方法:EatFood(),Sport(),ErrorSomething()
用vb.net写的Human派生类:Woman
他将覆盖Human的三个方法EatFood(),Sport(),ErrorSomething()
并将在ErrorSomething()中抛出一个异常
用c#写的Human派生类:Man
他将覆盖Human的三个方法EatFood(),Sport(),ErrorSomething()

我们使用受管制的c++来写写基类human,它实现了一个Iface接口,以支持吃东西和运动,同时有个叫ErrorSomething的虚函数,任何Human的具体继承类都必须实现这个方法.

代码如下
---------code start ------------
//文件名字:human.cpp
#using

  1<mscorlib.dll>   
  2using namespace System;   
  3public __gc __interface Iface   
  4{   
  5void EatFood();   
  6void Sport();   
  7}; 
  8
  9public __gc class Human:public Iface   
 10{   
 11public:   
 12virtual void EatFood()   
 13{   
 14Console::WriteLine("是人都得吃东西!");   
 15}   
 16virtual void Sport()   
 17{   
 18Console::WriteLine("生命在于运动!");   
 19}   
 20virtual void ErrorSomething()=0;   
 21}; 
 22
 23\--------------code end--------------- 
 24
 25同时保存该定义到human.dll文件中   
 26使用下面命令编译和连接   
 27cl /CLR /c human.cpp   
 28link -dll /out:human.dll -noentry human.obj 
 29
 30我们将使用vb.net从Human的基类中派声出一个叫Woman的类,在这里我们将覆盖EatFood(),Sport()和ErrorSomething三个方法,在这里ErrorSomething有点特殊,我们将在该方法中人工抛出一个异常,以测试当使用其他语言继承用vb.net写的该类后能不能捕获这个异常. 
 31
 32代码如下   
 33\---------------------code start--------------------   
 34'文件名字:woman.vb   
 35Imports System   
 36Public Class Woman   
 37Inherits Human   
 38Overrides Public Sub EatFood()   
 39Console.WriteLine("女性吃的东西")   
 40End Sub 
 41
 42Overrides Public Sub Sport()   
 43Console.WriteLine("女性运动")   
 44End Sub 
 45
 46Overrides Public Sub ErrorSomething()   
 47Console.WriteLine("女性类发生错误")   
 48throw new Exception("异常抛出")   
 49End Sub   
 50End Class   
 51\--------------------code end----------------------------- 
 52
 53使用vb.net编译器生成dll   
 54vbc /r:human.dll /t:library /out:woman.dll woman.vb 
 55
 56现在我们用c#生成从Human继承来的第二个类Man,和用vb.net生成的Woman类相似,这里同样将覆盖三个虚函数,但在ErrorSomething()方法中不抛出异常. 
 57
 58\---------code start-----------------   
 59//文件名: man.cs   
 60using System;   
 61public class Man:Human   
 62{   
 63override public void EatFood()   
 64{   
 65Console.WriteLine("男性吃的东西");   
 66}   
 67override public void Sport()   
 68{   
 69Console.WriteLine("男性运动");   
 70}   
 71override public void ErrorSomething()   
 72{   
 73Console.WriteLine("男性发生错误");   
 74}   
 75}   
 76\--------------code end--------------   
 77使用如下命令生成dll   
 78csc /r:human.dll /t:library /out:man.dll man.cs 
 79
 80最后让我们生成一个测试类,以测试跨语言应用多态性和异常处理   
 81以下代码使用c#包含一个Main()方法,带有一个Human应用和一个异常处理器.   
 82\--------------code start-------------------------   
 83//文件名:test.cs   
 84using System;   
 85class Test   
 86{   
 87public static void Main()   
 88{   
 89Human hh;   
 90try   
 91{   
 92Man mm=new Man();   
 93hh=mm;   
 94hh.EatFood();   
 95hh.ErrorSomething();   
 96  
 97Woman ww=new Woman();   
 98hh=ww;   
 99hh.EatFood();   
100hh.ErrorSomething();   
101}   
102catch(Exception e)   
103{   
104Console.WriteLine(e.ToString());   
105}   
106}   
107}   
108\--------------code end------------------------   
109在Test类中有个Main()方法.首先定义了一个来自Human类的对象hh,在try语句中先实例化了一个Man类,并用hh引用指向它.这里我们没有让Man去执行EatFood(),或者ErrorSomething(),而是让一个Human对象hh去做,同样实例化一个Woman类,用hh引用指向他,也不让Woman类去执行EatFood()或者ErrorSomething(),而是让Human对象去做.表面上看是Human执行EatFood()和ErrorSomething(),但实际上前者是Man是实例,后者是Woman实例.也就是多态性,不过他是跨语言的 
110
111同时在第二个ErrorSomething中因为是个Woman类,它抛出了个异常,我们将在Test类中捕获这个异常,由于异常的抛出那段程序是用vb.net写的,而我们捕获异常是在c#中,这也就说明了异常的处理同样是可以跨语言的. 
112
113通过以下命令创建一个exe文件   
114csc /r:human.dll;woman.dll;man.dll /t:exe /out:test.exe test.cs 
115
116其各部分编译和最后运行结果如下图: ![](http://61.128.234.5/article/article1.jpg)</mscorlib.dll>
Published At
Categories with Web编程
Tagged with
comments powered by Disqus