[英]How to access instance members of an abstract parent class?
如果無法創建父類(抽象)的實例,我們如何訪問子類中抽象父類的實例成員?
TL:RD; 答案是肯定的。 但是它們不會被復制。
比方說:
public abstract class A
{
public string Code { get;set; }
}
是您的超級(父/母)類,並且
public class B : A
{
public string Title { get;set; }
}
是您的派生(子)類。 類B的實例將包含屬性Code和Title。
B類擴展了A類。這使得通過簡單地將B類的實例強制轉換為A類成為可能。
B foo = new B();
A bar = foo as A;
盡管我建議您使用接口而不是超類來檢查實例是否具有您要查找的特定屬性。
同樣,A類的屬性和方法不會復制到B類。B類將其方法和屬性擴展到A類。
-編輯-
要回答這個問題:兩個構造函數都被調用了,那么實際上不是2個不同的對象嗎?
在編譯器級別,是的,抽象類和派生類是2個不同的對象。 但是,作為實例B的用戶,您不必擔心B實際上是由B和A組成的對象。
在上面的示例中,如果將B強制轉換為A。然后修改屬性“代碼”。 然后將對象轉換回B。“代碼”屬性仍設置為新值。
例:
B foo = new B();
foo.Code = "testfoo";
Console.WriteLine(foo.Code); //output will be testfoo;
A bar = foo as A;
bar.Code = "testbar";
Console.WriteLine(bar.Code); //output will be testbar;
但是也:
Console.WriteLine(foo.Code); //output will be testbar;
這是因為派生類B實際上不包含屬性Code。 它只說它擴展了A,並且A具有屬性Code。
但! 如果使用new(vb.net中的陰影),您的疑問將是合理的。
例:
public abstract class A
{
public string Code { get;set; }
}
public class B : A
{
public new string Code { get;set; }
public string Title { get;set; }
}
然后發生的就是我認為您擔心發生的事情。
現在,派生類和超類都具有屬性“ Code”。
在此示例中,輸出實際上將根據您如何看待對象而有所不同。
在這種情況下,確實會發生一些奇怪的事情,如果使用不當,很容易出錯。
例:
B foo = new B();
foo.Code = "testfoo";
Console.WriteLine(foo.Code); //output will be testfoo;
A bar = foo as A;
bar.Code = "testbar";
Console.WriteLine(bar.Code); //output will be testbar;
但現在 :
Console.WriteLine(foo.Code); //output will be testfoo;
同樣,術語抽象對您的類沒有更多的作用,除了指出不能單獨構造它,還必須繼承它才能構造它。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.