多重继承和对象C#

6

很抱歉,这个问题没有什么奇怪的标题。

我曾经被教导过.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和一个继承fooList的类foo,根据说法(C#不支持多重继承),类foo的对象应该只有一个来自fooList类的方法Index(), 但是它具有更多的来自object类的方法。这明确表明默认情况下所有的类都继承object类,因此问题就产生了。

  1. C#真的完全不支持多重继承吗?
  2. 我猜它在CLR层面支持多重继承,那么为什么它在编码中不支持呢?

1
这不是多重继承的情况。如果没有另外指定,每个类都会从object继承。如果您直接从另一个类继承,则间接地从object继承,因为该类从object继承。Object是所有对象的根源。 - Andreas
2
“class fooList” 是 “class fooList : object”的简写。这应该可以解除你的困惑。 - user1096188
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 是合法的,并且您需要实现作为 C 一部分定义的接口 B 定义的各种成员。

4
多重继承并不是你在这里看到的。多重继承是指一个类“同时”从两个基类派生,例如:
public class Test : Base1, Base2 {}

这是不可能的。

你在这里看到的(并且在任何面向对象的语言中都适用)是,当然一个类A会继承所有层次结构中的方法和属性。

例如:

public class Test : Base {}

如果Base是从Object直接派生的,则Derived将继承BaseObject的所有方法。

所以,如果您有以下继承关系:

public class Base : Object {}
public class A : Base {}

Base继承了Object的所有方法和属性,A继承了Base的所有方法和属性,因此也继承了Object的所有方法和属性。

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


1
你展示了多标签继承的例子,而不是多重继承。
多重继承意味着一个类可以继承多个类。
class A: B,C

在C#的情况下,以下哪项不是真实的。

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

0
除了Index()方法外,其他方法都来自于Object类,该类是所有引用类型和值类型的基类。C#确实不允许多重继承,但它支持多级继承,如果我们使用接口,则C#支持多重继承。
C#不支持多重继承,以消除当两个基类中有相同方法定义时可能出现的歧义,并且通过查看代码会感到困惑,不知道哪个版本的方法将被调用。请查看此link
可以通过以下示例中的两个接口来消除这种不确定性;
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"

正如您所看到的,我们可以通过在派生类中显式定义它们来为接口的两个函数设置不同的行为,从而避免任何歧义。

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


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接