从system.object派生的C#类型

时间:2014-01-15 07:18:18

标签: c# inheritance

据我所知,C#支持使用Interfaces进行多重继承。当我通过C#book通过CLR时,我得到了一个查询。这本书说

运行时要求每个类型最终都是从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 {
...
}

7 个答案:

答案 0 :(得分:6)

您不能这样做,因为不允许从类中继承多个继承:

class SoftwareEngineer : Employee, System.Object

上面的行会给你编译错误:

  

'SoftwareEngineer'不能有多个基类:'Employee'和   'System.Object的'

Employee隐含地继承自System.Object,这意味着SoftwareEngineer也将继承自System.Object(您可以将其视为'垂直'继承):

class Employee : System.Object

class SoftwareEngineer : Employee

答案 1 :(得分:4)

这是一种常见的误解,但界面实现与继承完全不同。除了看起来相似之外,它们没有任何共同之处。

接口实现在编译时发生,基本上说“实现类必须包含某些成员签名”。相反,继承是使用Virtual Method Table实现的动态运行时行为。

因此,实现多个接口没有问题,而禁止多重继承。

答案 2 :(得分:1)

您无法从c#中的多个类继承。

所以第二个是假的。

Employee继承自Object SoftwareEngineer继承自Employee

但是SoftwareEngineer可以从工程师访问可见方法,从Object访问可见方法(例如ToString

答案 3 :(得分:1)

  

运行时要求每个类型最终从System.Object类型

派生

在您的第二个示例中,SoftwareEngineer继承自Employee,而Object继承自Object第二个声明是非法的,因为C#允许多个继承(实现多个接口是一个不同的概念),但它实际上仍然继承自{{1}},因为它的基类型。

答案 4 :(得分:1)

没有

Employee类派生自System.Object。所以间接的SoftwareEngineer派生自System.Object。

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

这会给你语法错误。即使有其他课程也不可能。层次结构是一个类派生自父亲,父亲将驱逐祖父等等。

答案 5 :(得分:1)

首先,C#*不支持多个inheritanc * e,所以

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

“最终从System.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
  ...

答案 6 :(得分:0)

如果允许的话

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

基本上与:

相同
class SoftwareEngineer : Employee { ... }

..因为一个Employee是隐式的,无论如何都是一个Object(但是你无论如何都不能使用那个形式)。

您可以使用以下界面执行以下操作:

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

..但System.Object在这里仍然是多余的,因为再次 - SoftwareEngineer总是隐含地是Object