感受.net的跨语言特性

    技术2022-05-11  24

    <script type="text/javascript"> </script> <script type="text/javascript" src="http://pagead2.googlesyndication.com/pagead/show_ads.js"> </script> <script type="text/javascript"> </script><script type="text/javascript" src="http://pagead2.googlesyndication.com/pagead/show_ads.js"> </script>

    感受.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 <mscorlib.dll>using namespace System;public __gc __interface Iface{ void EatFood(); void Sport();};

    public __gc class Human:public Iface{ public: virtual void EatFood() {  Console::WriteLine("是人都得吃东西!"); } virtual void Sport() {  Console::WriteLine("生命在于运动!"); } virtual void ErrorSomething()=0;};

    --------------code end---------------

    同时保存该定义到human.dll文件中使用下面命令编译和连接cl /CLR /c human.cpplink -dll /out:human.dll -noentry human.obj

      我们将使用vb.net从Human的基类中派声出一个叫Woman的类,在这里我们将覆盖EatFood(),Sport()和ErrorSomething三个方法,在这里ErrorSomething有点特殊,我们将在该方法中人工抛出一个异常,以测试当使用其他语言继承用vb.net写的该类后能不能捕获这个异常.

    代码如下---------------------code start--------------------'文件名字:woman.vbImports SystemPublic Class WomanInherits HumanOverrides Public Sub EatFood()Console.WriteLine("女性吃的东西")End Sub

    Overrides Public Sub Sport()Console.WriteLine("女性运动")End Sub

    Overrides Public Sub ErrorSomething()Console.WriteLine("女性类发生错误")throw new Exception("异常抛出")End SubEnd Class--------------------code end-----------------------------

    使用vb.net编译器生成dllvbc /r:human.dll /t:library /out:woman.dll woman.vb

      现在我们用c#生成从Human继承来的第二个类Man,和用vb.net生成的Woman类相似,这里同样将覆盖三个虚函数,但在ErrorSomething()方法中不抛出异常.

    ---------code start-----------------//文件名: man.csusing System;public class Man:Human{ override public void EatFood() {  Console.WriteLine("男性吃的东西"); } override public void Sport() {  Console.WriteLine("男性运动"); } override public void ErrorSomething() {  Console.WriteLine("男性发生错误"); }}--------------code end--------------使用如下命令生成dllcsc /r:human.dll /t:library /out:man.dll man.cs

      最后让我们生成一个测试类,以测试跨语言应用多态性和异常处理以下代码使用c#包含一个Main()方法,带有一个Human应用和一个异常处理器.--------------code start-------------------------//文件名:test.csusing System;class Test{ public static void Main() {  Human hh;  try  {   Man mm=new Man();   hh=mm;   hh.EatFood();   hh.ErrorSomething();      Woman ww=new Woman();   hh=ww;   hh.EatFood();   hh.ErrorSomething();  }  catch(Exception e)  {   Console.WriteLine(e.ToString());  } }}--------------code end------------------------  在Test类中有个Main()方法.首先定义了一个来自Human类的对象hh,在try语句中先实例化了一个Man类,并用hh引用指向它.这里我们没有让Man去执行EatFood(),或者ErrorSomething(),而是让一个Human对象hh去做,同样实例化一个Woman类,用hh引用指向他,也不让Woman类去执行EatFood()或者ErrorSomething(),而是让Human对象去做.表面上看是Human执行EatFood()和ErrorSomething(),但实际上前者是Man是实例,后者是Woman实例.也就是多态性,不过他是跨语言的

      同时在第二个ErrorSomething中因为是个Woman类,它抛出了个异常,我们将在Test类中捕获这个异常,由于异常的抛出那段程序是用vb.net写的,而我们捕获异常是在c#中,这也就说明了异常的处理同样是可以跨语言的.

    通过以下命令创建一个exe文件csc /r:human.dll;woman.dll;man.dll /t:exe /out:test.exe test.cs

    其各部分编译和最后运行结果如下图:

     

    <script type="text/javascript"> </script> <script type="text/javascript" src="http://pagead2.googlesyndication.com/pagead/show_ads.js"> </script> <script type="text/javascript"> </script><script type="text/javascript" src="http://pagead2.googlesyndication.com/pagead/show_ads.js"> </script>

    最新回复(0)