程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
 程式師世界 >> 編程語言 >> .NET網頁編程 >> C# >> C#入門知識 >> C#是不是不能把基類對象強轉成它派生類對象

C#是不是不能把基類對象強轉成它派生類對象

編輯: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.2cto.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。

  1. 上一頁:
  2. 下一頁:
Copyright © 程式師世界 All Rights Reserved