6

抱歉,这个问题没有得到任何时髦的标题。

我被告知 .Net(C#) 不支持Multiple Inheritance。但是看看下面的 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#不支持多重继承),类的对象foo应该只有一个Index()来自fooList类的方法,但它有更多来自对象的方法班级。它清楚地表明默认情况下所有类都继承object类。所以问题就来了

  1. C# 不支持多重继承真的完全正确吗?
  2. 我猜它在 CLR 级别支持它,而不是为什么它在编码中不支持它?
4

5 回答 5

14

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 的一部分的各种成员。

于 2013-05-27T06:37:35.527 回答
4

多重继承不是您在这里看到的。多重继承意味着一个类“并行”派生自两个基类,可能像这样:

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

否则就不可能建立类层次结构。

于 2013-05-27T06:39:07.913 回答
1

您正在展示多标签继承而不是多继承的示例。

多重继承意味着一个类可以继承多个类。

class A: B,C

在 c# 的情况下这是不正确的

于 2013-05-27T06:41:28.770 回答
1

您误解了多重继承。一个类可以继承一个已经继承另一个类的类。但是一个类不能同时继承两个或多个不同的类。

// 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
于 2013-05-27T06:43:48.033 回答
0

除了 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"

正如你所看到的,我们可以通过在派生类中显式定义它们来对两个接口的功能有不同的行为,这将防止任何歧义。

这里还有一点需要注意的是,派生类中的函数定义不能是公共的,因为它不能被派生类型的实例访问。

于 2013-05-27T07:16:00.737 回答