2014-12-05 71 views
-4

我們假設你有一個動物類型列表,並添加了cat和dog類型的對象。 貓和狗都是從動物繼承而來,每個都有自己特定的領域。C#繼承重鑄

如果你從對象列表中取回對象並將它們從Animal重新轉換回它們原來的貓或狗的類型,它們是否會丟失這些字段?

+7

'將對象從列表中取回並重新將它們重新放回原來的位置......在問這個問題之前,您是否嘗試過? – ekad 2014-12-05 12:23:27

+0

你不會失去任何東西。 – 2014-12-05 12:25:07

+2

Rep-farmer誘餌。做一些工作,人們! – Gusdor 2014-12-05 12:28:09

回答

0

您存儲仍然型貓或狗的物體上,他們只是暫時視爲更廣泛類型的「動物」。如果你把它們拿出來併成功地將它們轉換成正確的類型,那麼你就可以看到它們一直有的所有數據。

0

否。對象本身始終是相同的類型;他們在一生中途不會改變類型。他們可能被視爲另一種類型在某種情況下(如在列表中),但這並不改變他們是什麼。

0

您的問題的答案是沒有,他們肯定不會失去他們的公共成員訪問權限。

這裏就是你們的榜樣的工作實現:

class MainClass 
    { 
     public static void Main (string[] args) 
     { 
      List<Animal> animals = new List<Animal>(); 
      var dog = new Dog(); 
      dog.BallsFetched = 5; 
      var cat = new Cat(); 
      cat.MiceCaught = 23; 
      animals.Add(dog); 
      animals.Add (cat); 

      Console.WriteLine(((Cat)animals [0]).MiceCaught); 
     } 
    } 

    public class Animal{ 
     public string Color; 
     public string Name; 
    } 

    public class Cat : Animal{ 
     public int MiceCaught; 
    } 

    public class Dog : Animal{ 
     public int BallsFetched; 
    } 

您也可以使用is operator檢查對象鑄造之前屬於某個聲明。

0

技術上當鑄造到另一種類型你轉換那個對象。

double d = 123.456; 
int i = (int)d; // d value is gone forever 
double dd = (double)i; // you loose .456 part 

然而,在鑄造基類(或接口)的轉換實際上的情況下不發生。在這種情況下考慮鑄造就好像你只能看到(通過window?;))只有那些成員,新的類型定義了什麼(new type = base class)。當它回退時,您將刪除該窗口並再次看到完整的對象。

在這個例子中

public class A {} 
public class B : A { public object B} 
public class C : B { public object C; } 

var c = new C() { B = 1, C = 2 }; 

你可以施放c

var a = (A)c; // through A window - nothing is visible 

var b = (B)a; 
var test1 = b.B; // you can see something through B window, test1 = 1 

var cc = (C)b; 
var test2 = cc.C; // you can see everything again, test2 = 2 

雖然是一個鑄造變型,對象是仍然是相同的。沒有什麼會丟失。