分享
 
 
 

感受.net的跨语言特性

王朝c#·作者佚名  2006-01-08
窄屏简体版  字體: |||超大  

感受.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

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

 
 
 
免责声明:本文为网络用户发布,其观点仅代表作者个人观点,与本站无关,本站仅提供信息存储服务。文中陈述内容未经本站证实,其真实性、完整性、及时性本站不作任何保证或承诺,请读者仅作参考,并请自行核实相关内容。
2023年上半年GDP全球前十五强
 百态   2023-10-24
美众议院议长启动对拜登的弹劾调查
 百态   2023-09-13
上海、济南、武汉等多地出现不明坠落物
 探索   2023-09-06
印度或要将国名改为“巴拉特”
 百态   2023-09-06
男子为女友送行,买票不登机被捕
 百态   2023-08-20
手机地震预警功能怎么开?
 干货   2023-08-06
女子4年卖2套房花700多万做美容:不但没变美脸,面部还出现变形
 百态   2023-08-04
住户一楼被水淹 还冲来8头猪
 百态   2023-07-31
女子体内爬出大量瓜子状活虫
 百态   2023-07-25
地球连续35年收到神秘规律性信号,网友:不要回答!
 探索   2023-07-21
全球镓价格本周大涨27%
 探索   2023-07-09
钱都流向了那些不缺钱的人,苦都留给了能吃苦的人
 探索   2023-07-02
倩女手游刀客魅者强控制(强混乱强眩晕强睡眠)和对应控制抗性的关系
 百态   2020-08-20
美国5月9日最新疫情:美国确诊人数突破131万
 百态   2020-05-09
荷兰政府宣布将集体辞职
 干货   2020-04-30
倩女幽魂手游师徒任务情义春秋猜成语答案逍遥观:鹏程万里
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案神机营:射石饮羽
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案昆仑山:拔刀相助
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案天工阁:鬼斧神工
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案丝路古道:单枪匹马
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案镇郊荒野:与虎谋皮
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案镇郊荒野:李代桃僵
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案镇郊荒野:指鹿为马
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案金陵:小鸟依人
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案金陵:千金买邻
 干货   2019-11-12
 
推荐阅读
 
 
 
>>返回首頁<<
 
靜靜地坐在廢墟上,四周的荒凉一望無際,忽然覺得,淒涼也很美
© 2005- 王朝網路 版權所有