您的位置:首页 > 编程语言 > C#

C#中is和as、向上强制转换和向下强制装换之详解

2015-09-05 11:02 288 查看
首先,第一个出现的是is,有时,我们需要查看某个类是否实现了一个接口,这个时候就可以使用is关键字来找出答案:

<span style="font-family:SimHei;font-size:18px;">for(int I = 0; i< bees.Length; i++){
if(bees[i] is IWorker){
//code do something.
}
}</span>注:接口用I开头。
除此之外,使用is不仅可以查看某个类是否实现了一个接口,也可以查看派生了哪个类。在这儿需要注意如果查看派生了哪个类,格式为:powerConsumer is CoffeeMaker,其中powerConsumer是父类的引用,CoffeeMaker是子类。这一点需要注意。

其次,第二个出现的是as,is指出一个对象实现了什么,as告诉编译器如何看待一个对象:

<span style="font-family:SimHei;font-size:18px;">for(int i =0; i< bees.Length; i++){
if(bees[i] is IWorker){
IWorker thisWorker;
thisWorker = bees[i] as IWorker;
thisWorker.dowork();
}
}
</span>
注意:上例使用as将一个对象看成了其实现的接口时,thisWorker只能使用接口中的方法,不能使用原来类中的方法。

这时,向上强制转换和向下强制转化进入视野。首先来看向上强制转换:用子类代替基类时(比如用一个咖啡机代替家用电器),称为向上强制转换(upcasting),向上强制转换唯一的缺点是,只能使用基类的属性和方法。
例如:Appliance是一个家用电器基类,CoffeeMaker是一个继承自Appliance的子类。声明如下:

<span style="font-family:SimHei;font-size:18px;">Appliance powerConsumer = new CoffeeMaker();
powerConsumer.ConsumePower();</span>解读如下:上述程序可以分解为如下:
<span style="font-family:SimHei;font-size:18px;">Appliance powerConsumer;
powerConsumer = new CoffeeMaker();
powerConsumer.ConsumePower();</span>

首先程序创建一个Appliance类型的变量名为powerConsumer的引用,这个时候内存中没有任何东西。接着创建一个指向CoffeeMaker的实例对象,将powerConsumer引用指向这个实例对象,此时内存中有了一个CoffeeMaker类的实例对象,但是引用类型为Appliance,此时,使用powerConsumer变量时,将其看作Appliance类型使用,并不是CoffeeMaker,虽然内存中存在的是CoffeeMaker类的实例对象,之所以这样是合理有效的原因是CoffeeMaker继承自Appliance。如下所示,原理一样:
<span style="font-family:SimHei;font-size:18px;">Appliance[] kitchenWare = new Appliance[];
kitchenWare[0] = new CoffeeWorker();
kitchenWare[1] = new Oven();</span>

有了向上强制转换,那就必须要向下强制转换(downcasting):也就是将先前的向上强制转化引用变回来。可以使用is关键字明确一个Appliance对象是否实际上是一个CoffeeMaker,一旦确定,可以使用as关键字把这个Appliance再变回为一个CoffeeMaker。

<span style="font-family:SimHei;font-size:18px;">if(powerConsumer is CoffeeWorker){
CoffeeWorker javaJoe = powerConsumer as CoffeeWorker;
javaJoe.MakeCoffee();
}</span>

到这里,is和as、向上强制转换和向下强制转换讲解完毕,希望对大家有所帮助!
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  c# 对象 is as