2013-05-27 2 views
5

Извините, у меня не было никакого напуганного названия.Множественное наследование и объекты C#

Меня учили, что .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 который наследует fooList согласно изречениям (C# не поддерживает множественное наследование) объект класса foo должен иметь только один метод, который Index() из класса fooList, но он имеет больше методов из класса объектов. Это ясно указывает, что по умолчанию все классы наследуют класс object. Поэтому вопросы поднимаются

  1. Действительно ли это действительно так, что C# не поддерживает несколько Inheritance?
  2. Я предполагаю, что он поддерживает его на уровне CLR, Чем он не поддерживает его в кодировке?
+1

Это не случай множественного наследования. Каждый класс наследует объект, если не указано иное. Если вы наследуете другой класс напрямую, вы косвенно наследуете объект, поскольку этот класс наследует объект. Объект является корнем для всех объектов. – Andreas

+1

'class fooList' является сокращением для' class fooList: object'. Это должно устранить вашу путаницу. – user1096188

ответ

13

C# не поддерживает множественное наследование классов на одном уровне. C# поддерживает несколько уровней наследования в иерархии. То, что вы видите, это то, что в верхней части вашего наследования hierachy равен System.Object, который является базовым классом верхнего уровня для классов и структур .NET.

То, что вы не можете иметь:

class A { } 
class B { } 
class C : A, B { } 

Что вы можете иметь: чувство

class A { } 
class B : A { } 
class C : B { } 

Make?

Для получения дополнительной полноты, C# позволяет вам имитировать множественное наследование с использованием интерфейсов. Так что давайте вернемся.

class A { } 
interface B { } 
class C : A, B { } // legal 

В этом примере, объявление C является законным, и вам нужно будет выполнять различные элементы, которые взаимодействуют B определяет как часть С.

+0

+1 для указания интерфейсов. –

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.

В противном случае невозможно было бы построить иерархии классов.

1

Вы показываете пример наследования нескольких меток, а не множественного наследования.

Множественное наследование означает, что один класс может наследовать более одного класса.

class A: B,C 

Что не так в случае C#

1

Вы missunderstanding множественного наследования. Класс может наследовать класс, который уже наследует другой класс. Но класс не может наследовать два или более разных класса одновременно.

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

Как вы можете видеть, что мы можем иметь различные модели поведения для функций как интерфейс, явно определяя их в производном классе, который не допускал бы от какой-либо двусмысленности.

Еще один момент, который следует отметить здесь, состоит в том, что определения функций в производном классе не могут быть общедоступными, поскольку к нему не может обращаться экземпляр производного типа.

Смежные вопросы