2014-01-15 66 views
2

據我所知,C#支持不直接使用Interfaces的多重繼承。當我通過C#書通過CLR時,我對此有了一個疑問。這本書說從system.object派生的C#類型

運行時需要每種類型最終從System.Object類型派生。這 意味着以下兩種類型的定義是相同的:

// Implicitly derived from Object 
class Employee { 
.... 
} 

// Explicitly derived from Object 
class Employee : System.Object { 
... 
} 

如果這是正確的說法,可以下面提到的代碼是真的嗎?

// Implicitly derived from Object 
class SoftwareEngineer : Employee 
{ 
.... 
} 

// Explicitly derived from Object 
class SoftwareEngineer : Employee, System.Object { 
... 
} 
+1

第二個不會編譯...我可以問你想要做什麼?你提到你的問題中的接口,但不要在你的代碼中使用它們。 –

回答

6

你不能這樣做,因爲從類多重繼承是不允許的:

class SoftwareEngineer : Employee, System.Object 

線之上會給你編譯錯誤:

'SoftwareEngineer' cannot have multiple base classes: 'Employee' and 'System.Object'

但這樣EmployeeSystem.Object隱含繼承這意味着SoftwareEngineer也將從System.Object繼承(您可以將其視爲'垂直'inh e):

class Employee : System.Object 

class SoftwareEngineer : Employee 
1

你不能從c#中的多個類繼承。

所以第二個是錯誤的。

員工從Object SoftwareEngineer從員工

繼承

但SoftwareEngineer可以訪問工程師和可見方法可見方法從對象(例如像ToString

1

The runtime requires every type to ultimately be derived from the System.Object type

在你的第二個例子,SoftwareEngineer繼承繼承從Employee,繼而從Object繼承第二個聲明是非法的,因爲C#不是而不是允許多繼承(實現多個接口是不同的概念),但它實際上仍然繼承自Object,因爲它是基類型的。

1

編號

僱員類派生自System.Object。所以間接SoftwareEngineer派生自System.Object。

// Explicitly derived from Object 
class SoftwareEngineer : Employee, System.Object { 
... 
} 

這會給你語法錯誤。即使有其他課程也不可能。層次結構是一個類將從父親派生出來,而父親將來自父親的驅動程序等等。

4

這是一種常見的誤解,但接口實現是與繼承完全不同。除了他們看起來相似外,他們沒有任何共同之處。

接口實現發生在編譯時,基本上說「實現類必須包含某些成員簽名」。相反,繼承是使用Virtual Method Table實現的動態運行時行爲。

因此實現多接口是沒有問題的,而多重繼承是被禁止的。

1

起初,C#*不支持多inheritanc * E,所以

class SoftwareEngineer : Employee, System.Object { ... } // <- Compile time error 

「每個類型,以最終從System.Object派生」短語 意味着每遺產鏈應結束於Object,例如

SafeHandleMinusOneIsInvalid // <- inherited from 
    SafeHandle     // <- which in turn inherited from 
    CriticalFinalizerObject  // <- which finally inherited from 
    Object      // <- The ultimate base class 

接口不是類;它們是一種合同,例如

public class MyVersion: 
    IComparable<MyVersion>, // <- I guarantee, there's "int CompareTo(MyVersion other)" method 
    ICloneable,    // <- I guarantee, there's "Object Clone()" method 
    ... 
0

此,如果允許的話

class SoftwareEngineer : Employee, System.Object { ... } 

將基本上是一樣的:

class SoftwareEngineer : Employee { ... } 

..since的員工是含蓄,對象反正(但是你不能使用這種形式)。

你可以做類似與界面如下:

// Implements IEmployee, and an IPerson (interfaces), 
// while inheriting from System.Object: 
class SoftwareEngineer : System.Object, IEmployee, IPerson { ... } 

..但這裏的System.Object仍然是多餘的,因爲再 - SoftwareEngineer總是含蓄是Object反正。