感受.net的跨语言特性

发表于:2007-05-25来源:作者:点击数: 标签:感受.NET特性语言
感受.net的跨语言特性 这段时间学习.net,在网上也找了很多的资料,发现大多的教程都在讨论着.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 <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.cpp
link -dll /out:human.dll -noentry human.obj

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

代码如下
---------------------code start--------------------
'文件名字:woman.vb
Imports System
Public Class Woman
Inherits Human
Overrides 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 Sub
End Class
--------------------code end-----------------------------

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

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

---------code start-----------------
//文件名: man.cs
using 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--------------
使用如下命令生成dll
csc /r:human.dll /t:library /out:man.dll man.cs

  最后让我们生成一个测试类,以测试跨语言应用多态性和异常处理
以下代码使用c#包含一个Main()方法,带有一个Human应用和一个异常处理器.
--------------code start-------------------------
//文件名:test.cs
using 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

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

 

原文转自:http://www.ltesting.net

评论列表(网友评论仅供网友表达个人看法,并不表明本站同意其观点或证实其描述)