多重继承和对象C#

时间:2013-05-27 06:34:10

标签: c# oop

很抱歉没有得到任何有趣的标题。

我被告知.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和一个类foo,根据这些说法(C#不支持多重继承)继承fooList类的对象{ {1}}应该只有一个fooIndex()的方法,但它有更多来自对象类的方法。它清楚地表明默认情况下所有类都继承fooList类。所以提出问题

  1. C#不支持Multiple是否真的完全正确 继承?
  2. 我想它在CLR级别支持它,而不是它不支持它的原因 在编码?

5 个答案:

答案 0 :(得分:13)

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

答案 1 :(得分:4)

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

public class Test : Base1, Base2 {}

这是不可能的。

你在这里看到的(这适用于任何面向对象的语言)当然是A类继承了整个层次结构的方法和属性。

例如:

public class Test : Base {}
如果Base直接来自Object

会继承BaseObject的所有方法。

所以如果你有这个层次结构:

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

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

否则就无法构建类层次结构。

答案 2 :(得分:1)

您正在显示多标签继承的示例,而不是多重继承。

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

class A: B,C

在c#

的情况下,情况并非如此

答案 3 :(得分: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

答案 4 :(得分:0)

除了Index()方法之外,其他方法来自Object类,它是所有引用类型的基类以及值类型。 C#不允许多重继承但它支持多级继承是非常正确的,如果我们使用Interfaces,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"

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

此处需要注意的另一点是,派生类中的函数定义不能公开,因为它不能被派生类型的实例访问。