我們假設你有一個動物類型列表,並添加了cat和dog類型的對象。 貓和狗都是從動物繼承而來,每個都有自己特定的領域。C#繼承重鑄
如果你從對象列表中取回對象並將它們從Animal重新轉換回它們原來的貓或狗的類型,它們是否會丟失這些字段?
我們假設你有一個動物類型列表,並添加了cat和dog類型的對象。 貓和狗都是從動物繼承而來,每個都有自己特定的領域。C#繼承重鑄
如果你從對象列表中取回對象並將它們從Animal重新轉換回它們原來的貓或狗的類型,它們是否會丟失這些字段?
號
您存儲仍然型貓或狗的物體上,他們只是暫時視爲更廣泛類型的「動物」。如果你把它們拿出來併成功地將它們轉換成正確的類型,那麼你就可以看到它們一直有的所有數據。
否。對象本身始終是相同的類型;他們在一生中途不會改變類型。他們可能被視爲另一種類型在某種情況下(如在列表中),但這並不改變他們是什麼。
您的問題的答案是沒有,他們肯定不會失去他們的公共成員訪問權限。
這裏就是你們的榜樣的工作實現:
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檢查對象鑄造之前屬於某個聲明。
技術上當鑄造到另一種類型你轉換那個對象。
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
雖然是一個鑄造變型,對象是仍然是相同的。沒有什麼會丟失。
'將對象從列表中取回並重新將它們重新放回原來的位置......在問這個問題之前,您是否嘗試過? – ekad 2014-12-05 12:23:27
你不會失去任何東西。 – 2014-12-05 12:25:07
Rep-farmer誘餌。做一些工作,人們! – Gusdor 2014-12-05 12:28:09