簡體   English   中英

多重繼承和對象C#

[英]Multiple Inheritance and Objects C#

對不起,這個問題沒有任何時髦的標題。

有人告訴我.Net(C#)不支持多重繼承 但是看看下面的foo示例,我想知道這真的是事實嗎?

class fooList
{
    public int Index()
    {
        return 0;
    }
}    
class foo : fooList
{
    public foo()
    { }
}
class testFoo
{
    void test()
    {
        foo obj = new foo();

        // From object
        obj.Equals(obj);
        obj.GetHashCode();
        obj.GetType();
        obj.ToString();

        // From fooList
        obj.Index();
    }
}

如我們所見,我有一個fooList類和一個foo類, fooList根據俗語(C#不支持多重繼承)繼承fooListfoo類的對象應該只有一個方法,即fooList類中的Index() ,但是它具有來自對象類的更多方法。 它清楚地表明,默認情況下,所有類都繼承object類。 所以提出了問題

  1. C#不支持多重繼承真的完全正確嗎?
  2. 我猜它在CLR級別上支持它,而不是為什么它在編碼中不支持它?

C#不支持在單個級別上對類的多重繼承。 C#確實在層次結構的繼承支持多個級別 您會看到,繼承層次結構的頂部是System.Object ,它是.NET中類和結構的頂級基類。

您不能擁有的是:

class A { }
class B { }
class C : A, B { }

可以擁有:

class A { }
class B : A { }
class C : B { } 

說得通?

為了更加完整,C#確實允許您通過使用接口來模擬多重繼承。 因此,讓我們往回走。

class A { }
interface B { }
class C : A, B { } // legal

在此示例中,C的聲明合法的,並且您將需要實現接口B定義為C的各個成員。

多重繼承不是您在這里看到的。 多重繼承意味着一個類是“並行”地從兩個基類派生的,例如:

public class Test : Base1, Base2 {}

這是不可能的。

您在這里看到的(並且它在任何面向對象的語言中都有效)是一個類A,它繼承了整個層次結構的方法和屬性。

例如:

public class Test : Base {}

如果Base是直接從Object派生的,則從BaseObject繼承所有方法。

因此,如果您具有以下層次結構:

public class Base : Object {}
public class A : Base {}

BaseObject繼承所有方法和屬性,而ABase以及從Object繼承所有方法和屬性。

否則,將無法構建類層次結構。

您將顯示多標簽繼承而不是多重繼承的示例。

多重繼承意味着一個類可以繼承多個類。

class A: B,C

對於C#,這是不正確的

您在誤解多重繼承。 一個類可以繼承一個已經繼承了另一個類的類。 但是一個類不能同時繼承兩個或多個不同的類。

// Default inheritance from Object.
// Class A inherits System.Object
class A     

// Simple inheritance. This is not multiple inheritance.   
// Class B inherits class A, which inherits Object
class B : A     

// Simple inheritance. This is not multiple inheritance.
// Class C inherits class B, which inherits class A, which inherits Object
class C : B  

// Default inheritance from Object.
// Class D inherits System.Object
class D     

// Multiple inheritance
// Class E inherits both class A and class D
class E : A, D

// Multiple inheritance
// Class F inherits both class A and class B
class F : A, B

// Multiple inheritance
// Class G inherits both class C and class D
class G : C, D

除Index()方法外,其他方法也來自Object類,該類是所有引用類型和值類型的基類。 確實,C#不允許多重繼承,但它確實支持多級繼承,如果我們使用接口,則C#同樣支持多重繼承。

C#不支持多重繼承來消除模棱兩可的含義,如果兩個基類在其中定義了相同的方法,則可能會產生歧義,並且通過查看代碼將調用該方法的哪個版本會造成混淆。 查看此鏈接

可以通過以下示例中所示的兩個接口來消除這種不確定性。

public  interface IA
{
  string SomeMethod();
}

public interface IB
{
  string SomeMethod();
}

class MyConcreteClass:IA, IB
{
  string IA.SomeMethod()
  {
     return "For IA";       
  }

  string IB.SomeMethod()
  {
     return "For IB";       
  }
}

IA concA = new MyConcreteClass();
IB concB = new MyConcreteClass();

 Console.WriteLine(concA.SomeMethod()); // print "For IA"
 Console.WriteLine(concB.SomeMethod()); // print "For IB"

如您所見,通過在派生類中顯式定義接口的功能,我們可以對兩種接口的功能具有不同的行為,這可以防止任何歧義。

還有一點需要注意的是,派生類中的函數定義不能是公共的,因為派生類型的實例無法訪問它。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

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