据我所知,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 {
...
}
答案 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
。