当前位置:编程学习 > C#/ASP.NET >>

C#是不是不能把基类对象强转成它派生类对象

最近在论坛上看到有网友问到C#中对象强转的问题,自己虽然接触过C#,但对这个特性还是第一次接触,所以这里找到一些资料与大家一起分享。

一、代码
[csharp]
class Program 

  static void Main(string[] args) 
  { 
  A a = new A(); 
  B b =new B(); 
  b.a = 300; 
  b.b = 20; 
  B e = a.Clone() as B;//这里会运行错误 但是变成b.clone() as B 就会正常  
  System.Console.WriteLine(e.a); 
  } 

 
public class A : ICloneable    

  public A() 
  { 
     
  } 
 
  public int a=200; 
 
  #region ICloneable 成员  
  public virtual object Clone() 
  { 
    return MemberwiseClone(); 
  } 
  #endregion  
 

 
public class B:A 

  public int b = 10; 
 
  public B():base() 
  { 
     
  } 
  public override object Clone() 
  { 
    B c= base.Clone() as B;//为什么这里可以把基类变成派生类?????????  
    c.b = 100; 
    return c; 
  } 

class Program
{
  static void Main(string[] args)
  {
  A a = new A();
  B b =new B();
  b.a = 300;
  b.b = 20;
  B e = a.Clone() as B;//这里会运行错误 但是变成b.clone() as B 就会正常
  System.Console.WriteLine(e.a);
  }
}

public class A : ICloneable  
{
  public A()
  {
   
  }

  public int a=200;

  #region ICloneable 成员
  public virtual object Clone()
  {
   return MemberwiseClone();
  }
  #endregion

}

public class B:A
{
  public int b = 10;

  public B():base()
  {
   
  }
  public override object Clone()
  {
   B c= base.Clone() as B;//为什么这里可以把基类变成派生类?????????
   c.b = 100;
   return c;
  }
}
二、解释
1、解释“B e = a.Clone() as B;//这里会运行错误 但是变成b.clone() as B 就会正常”

你实例化是二个对象,而父类中没有关于子类的对象相关的内存,无法转

这段代码代码的分析很简单:
a.Clone()得到的仍然是一个A类型的对象。A是基类,没有B类的内存,所以基类是无法强制转换成派生类的。
b.Clone()得到的就B类型的对象了。所以可以AS B。

给你一个例子:


[csharp]
A a = new A(); 
B b = new B(); 
A a2 = b; //这是可以的。  
B b2 = a2 as B; //这种强制转换也是可以成功的。 

A a = new A();www.zzzyk.com
B b = new B();
A a2 = b; //这是可以的。
B b2 = a2 as B; //这种强制转换也是可以成功的。
2、解释“B c= base.Clone() as B;//为什么这里可以把基类变成派生类????????? ”

这是因为你实例化的对象本身就是B,B相当包含A存在.所以可以转。

 


变量a不论你声明为什么类型,它指向一个A类对象。变量b不论你声明什么类型,它指向一个B类对象。不是说“可以把基类变成派生类”这种把类型类型和对象本身混淆起来,而是对象b既“是”A类对象也“是”B类对象,也就是说
  if(b is A && b is B)
  return true;
你可以试试看,这返回true。

补充:软件开发 , C# ,
CopyRight © 2022 站长资源库 编程知识问答 zzzyk.com All Rights Reserved
部分文章来自网络,