多重继承和对象c#

本文关键字:对象 多重继承 | 更新日期: 2023-09-27 18:15:42

不好意思,这个问题的题目没找到。

我被告知。net (c#)不支持多重继承。但是看看下面的例子,我想知道这真的是真的吗??
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类。所以问题来了

  1. c#真的不支持multi吗继承吗?
  2. 我猜它在CLR级别支持它,那为什么它不支持呢

多重继承和对象c#

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

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

public class Test : Base1, Base2 {}

那是不可能的。

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

例如:

public class Test : Base {}

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

如果你有这样的层次结构:

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

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

你正在展示一个多标签继承而不是多重继承的例子。

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

class A: B,C

这在c#

的情况下是不成立的

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

// 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

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

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

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