[英]Single Inheritance in C# - object class?
我很久以來一直在問自己這個問題。 想發布它。 C#不支持多重繼承(這是事實)。 在C#中創建的所有類都派生出'Object'類(同樣是一個事實)。
因此,如果C#不支持多繼承,那么即使它已經擴展了Object類,我們如何才能擴展一個類?
用一個例子說明:
我們能夠在步驟3之后在A中使用對象類方法。因此轉向多級繼承。 如果是這樣的話,那么
有人可以解釋一下嗎?
你將多重繼承與繼承樹混淆了。 您可以繼承Object之外的其他內容。 只是Object坐在你樹頂的那里。 有人可以繼承你的類,但是因為Object仍然位於頂層,所以該類也將繼承自object。 您的“多級”繼承不是多重繼承。
多重繼承是從兩個不同的樹繼承而來的.Net實際上通過接口來支持這種。
喬爾的回答是正確的。 多繼承和inhertance樹(或派生鏈)之間存在差異。 在您的示例中,您實際顯示了一個inhertance樹:一個對象從樹中較高的另一個對象繼承(派生)。 多重繼承允許一個對象從多個基類繼承。
舉例來說,以下樹:
public class BaseClass { }
public class SpecialBaseClass : BaseClass {}
public class SpecialtyDerivedClass : SpecialBaseClass {}
這是完全有效的,並且說SpecialtyDerivedClass繼承自SpecialBaseClass(SpecialtyDerivedClass'父級),而SpecialBaseClass又來自BaseClass(SpecialtyDerivedClass'祖父母)。
在多重繼承的想法下,示例如下所示:
public class BaseClass { }
public class SpecialBaseClass {}
public class SpecialtyDerivedClass : BaseClass, SpecialBaseClass {}
這在.NET中是不允許的,但它表示SpecialityDerivedClass繼承自BaseClass和SpecialBaseClass(它們都是父類)。
.NET允許您從多個接口繼承,從而允許一種多重繼承形式。 稍微改變上面的例子:
public class BaseClass { }
public interface ISpecialBase {}
public interface ISpecialDerived {}
public class SpecialtyDerivedClass : BaseClass, ISpecialBase, ISpecialDerived {}
這表示SpecialtyDerivedClass繼承自BaseClass(它的父級)以及ISpecialBase和ISpecialDerived(也是父級的,但更像是步驟父級,因為接口無法指定功能)。
所有類最終都來自Object。
public class A
隱含地等價於
public class A : System.Object
當你從另一個類派生時
public class A : B
哪里
public class B : System.Object
B成為父類,Object成為祖父類。
等等。
因此它是所有其他類的父,祖父母,曾祖父母(等)類。
一種看待它的方法是:C#有一個繼承樹 ,而C ++(或其他多重繼承語言)有一個繼承點 。
如下所示。
public class A : B
{
}
public class B : C
{
public int BProperty { get; set; }
}
public class C
{
public int CProperty { get; set; }
}
public class Test
{
public void TestStuff()
{
A a = new A();
// These are valid.
a.CProperty = 1;
a.BProperty = 2;
}
}
這是有效的。 在這種情況下,Object是C的基礎。
在該示例中,B可以擴展A的原因是因為A擴展了Object。 類只能指定一個父類,但該類必須是對象或具有對象作為其祖先之一。
如果未指定基類,則類繼承自object。 從而:
class C {}
是相同的
class C : Object {}
但是, 如果指定基類,它將從該類而不是Object繼承 。 從而,
class B : C {}
B直接繼承自C而不是Object。 另一個例子,
class A : B {}
在這種情況下,A繼承自B而不是Object。 總結一下,在這個層次結構中:
class C {}
class B : C {}
class A : B {}
A類派生自B,它派生自C.因此,A類間接地從C派生,因為B派生自C. C也派生自Object,未明確指定但默認存在。 所以A也間接地來自Object。
C#中的一個類只能有一個父類,但它可以有多個祖先。 您可以實現多個接口,但這僅表示您的類同意實現這些接口定義的簽名。 您實際上並未從這些接口繼承任何功能。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.