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、向上强制转换和向下强制转换讲解完毕,希望对大家有所帮助!
<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、向上强制转换和向下强制转换讲解完毕,希望对大家有所帮助!
相关文章推荐
- Python动态类型的学习---引用的理解
- Pull is not possible because you have unmerged ...
- c#调用COM组件
- CISCO交换机概览
- 攻击CISCO路由器
- 土人系列AS入门教程 -- 对象篇
- 土人系列AS入门教程--语法篇
- C#实现把指定数据写入串口
- C#动态创建button的方法
- C#中抽象方法与虚拟方法的区别
- c#中虚函数的相关使用方法
- C#使用加边法计算行列式的值
- C#实现多线程的同步方法实例分析
- C#中尾递归的使用、优化及编译器优化
- C#通用邮件发送类分享
- C#中this的用法集锦
- C#.NET获取拨号连接的宽带连接方法
- C#异步绑定数据实现方法
- C#实现AddRange为数组添加多个元素的方法
- 解决linux 出现如下报错:Another app is currently holding the yum lock;