簡體   English   中英

C#中的單一繼承 - 對象類?

[英]Single Inheritance in C# - object class?

我很久以來一直在問自己這個問題。 想發布它。 C#不支持多重繼承(這是事實)。 在C#中創建的所有類都派生出'Object'類(同樣是一個事實)。

因此,如果C#不支持多繼承,那么即使它已經擴展了Object類,我們如何才能擴展一個類?

用一個例子說明:

  1. A類:對象 - 創建的A類。
  2. B類:對象 - 創建B類。
  3. A類:B - 再次支持。 早期與對象的關聯會發生什么。

我們能夠在步驟3之后在A中使用對象類方法。因此轉向多級繼承。 如果是這樣的話,那么

  1. A類:B
  2. C級:B
  3. A類:C - 我必須能夠在A中訪問B類的方法。事實並非如此?

有人可以解釋一下嗎?

你將多重繼承與繼承樹混淆了。 您可以繼承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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM