[英]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#不支持多重繼承)繼承fooList
, foo
類的對象應該只有一個方法,即fooList
類中的Index()
,但是它具有來自對象類的更多方法。 它清楚地表明,默認情況下,所有類都繼承object
類。 所以提出了問題
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
派生的,則從Base
和Object
繼承所有方法。
因此,如果您具有以下層次結構:
public class Base : Object {}
public class A : Base {}
Base
從Object
繼承所有方法和屬性,而A
從Base
以及從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.