[英]Why a Struct can not be derived from another struct?
我對.Net和CLR的觀點回答更感興趣:
為什么struct不能是另一個struct的基類,反之亦然?
結構占據堆棧中的固定大小的插槽(或者它們居住的任何地方)。
因此,您將無法對結構進行任何類型的多態,因為派生的結構將是不同的大小。
有可能從其他結構繼承成員,但由於你不能做任何形式的多重現象,所以不值得混淆。
在.net中,如果類A
繼承自類型B
並且類型A
的對象被傳遞給期望類型為B
的對象的代碼,則傳遞的對象將不會被轉換為B
但仍將是A
這是可能的,因為每個對象都存儲了對類型描述符的引用。 類沒有與它們一起存儲的任何類型描述符。 a struct of type B
. 如果類型A
的結構可以通過值傳遞給期望類型為B
的結構的例程,那么它將類型B
的結構。 如果這是明智的,那么從A
到B
類定義擴展轉換運算符會更實際。
有時,通過引用傳遞類型A
的結構來預期類型B
可能是有用的。 轉換運營商不會幫助那里。 然而,通過使結構類型A
包含類型B
的字段,可以處理,盡管有點笨拙。 然后可以通過引用期望類型B
的例程來傳遞該字段; 困難在於,必須在任何字段訪問中包含內部結構的名稱。
什么是有用的,不僅是結構,而是類,也將是“擴展類型”的概念。 所有類,無論是否可繼承,都可以使用擴展類型進行擴展,擴展類型只包含實例成員; 擴展類型的變量或值將被視為基類型的運行時對象,擴展類型與其基類型之間或從相同基類型派生的擴展類型之間的所有轉換都將被視為“加寬”,並且將是作為無操作處理。 擴展類型的唯一影響是引入為該類型定義的范圍成員。 這些行為與擴展方法非常相似,只是它們只適用於聲明為擴展類型的變量和變量,擴展類型的成員優先於基類成員。 可以想象很多用於這類事情(如果有人想在類的某些實例上使用擴展方法,但可能不希望它們在所有實例上都可用),但是至於我所知道的語言還沒有支持這樣的特征。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.