2008-10-10 3 views
8

Я уже давно задаю себе этот вопрос. Мысль о публикации. C# не поддерживает множественное наследование (это факт). Все классы, созданные на C#, выходят из класса Object (опять-таки факт).Single Inheritance in C# - класс объекта?

Итак, если C# не поддерживает множественное наследование, то как мы можем расширить класс, даже если он уже расширяет класс Object?

Illustating с примером:

  1. класс А: объект - класс A создан.
  2. класс B: объект - класс B создан.
  3. класс A: B - это снова поддерживается. Что происходит с предыдущей ассоциацией объекта.

Мы можем использовать методы класса объектов в A после шага 3. Таким образом, это преобразование в многоуровневое наследование. Если это так, то

  1. Класс A: B
  2. Класс C: B
  3. Класс A: C - я должен быть в состоянии получить доступ к методам класса B в A. Что не так?

Может ли кто-нибудь объяснить это?

ответ

6

Ответ Джоэля правильный. Существует различие между множественным наследованием и деревом наследования (или цепочкой деривации). В вашем примере вы фактически показываете дерево наследования: Один объект наследует (выводит) из другого объекта выше в дереве. Множественное наследование позволяет одному объекту наследовать от нескольких базовых классов.

Возьмем, к примеру, следующее дерево:

public class BaseClass { } 

public class SpecialBaseClass : BaseClass {} 

public class SpecialtyDerivedClass : SpecialBaseClass {} 

Это вполне допустимо, и говорит, что SpecialtyDerivedClass наследует от SpecialBaseClass (родительского который, в свою очередь, происходит от BaseClass (SpecialtyDerivedClass SpecialtyDerivedClass) прародителя).

Под идеей множественного наследования, пример будет выглядеть следующим образом:

public class BaseClass { } 

public class SpecialBaseClass {} 

public class SpecialtyDerivedClass : BaseClass, SpecialBaseClass {} 

Это не допускается в .NET, но он говорит, что SpecialityDerivedClass наследует от обоих BaseClass и SpecialBaseClass (которые оба родителя) ,

. NET разрешает форму множественного наследования, позволяя вам наследовать более чем один интерфейс. выше немного Изменение примера:

public class BaseClass { } 

public interface ISpecialBase {} 

public interface ISpecialDerived {} 

public class SpecialtyDerivedClass : BaseClass, ISpecialBase, ISpecialDerived {} 

Это говорит о том, что SpecialtyDerivedClass наследует от BaseClass (это родитель), а также ISpecialBase и ISpecialDerived (также родитель, но больше как ступенчатых родители как интерфейсы не может указать функциональные возможности).

7

Вы вводите в заблуждение многоуровневое наследование с деревом наследования. Вы можете наследовать от чего-то другого, кроме Object. Это просто, что объект сидит там наверху вашего дерева. И кто-то может наследовать ваш класс, но поскольку объект все еще находится наверху, этот класс также наследует объект. Ваше многоуровневое наследование не является множественным наследованием.

Множественное наследование - это когда вы наследуете от двух разных деревьев, а .Net действительно поддерживает это после моды через интерфейсы.

+0

C# не поддерживает множественное наследование, но поддерживает несколько интерфейсов. Вы все еще можете наследовать только от одного объекта. – 2008-10-10 14:05:55

+0

Это просто семантика. Реализация интерфейса _is_ - слабая форма наследования. – 2008-10-10 14:07:40

+0

Заменить «ветвь дерева» для дерева и пропустить часть о реализации интерфейсов, являющихся наследованием. Внедрение интерфейса просто означает, что ваш класс гарантирует, что он определит подпись. Вы не наследуете никакого кода от интерфейса. Но, вы сказали «после моды», поэтому, я думаю ... – tvanfosson 2008-10-10 14:07:47

0

Данные ниже.

public class A : B 
{ 

} 

public class B : C 
{ 
    public int BProperty { get; set; } 
} 

public class C 
{ 
    public int CProperty { get; set; } 
} 

public class Test 
{ 
    public void TestStuff() 
    { 
     A a = new A(); 

     // These are valid. 
     a.CProperty = 1; 
     a.BProperty = 2; 
    } 

} 

Это действительно. В этом случае объект является базой для C.

4

Все классы В конечном итоге происходит от объекта.

public class A 

неявно эквивалентен

public class A : System.Object 

Когда вы черпаете из другого класса

public class A : B 

где

public class B : System.Object 

B становится родительский класс, и объект становится дедушкой класс ,

И так далее.

Таким образом, это класс родителей, дедушек, бабушек и дедушек (и т.д.) всех других классов.

0

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

0

Класс наследует от объекта , если вы не указали базовый класс. Таким образом:

class C {} 

такая же, как

class C : Object {} 

Однако , если указать базовый класс, он будет наследовать от этого класса вместо объекта. Таким образом,

class B : C {} 

B непосредственно наследует от C вместо объекта. Другой пример:

class A : B {} 

В этом случае А наследует от B вместо объекта. Подводя итог, в этой иерархии:

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

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

0

Класс в C# может иметь только одного родителя, но он может иметь несколько предков. Вы можете реализовать несколько интерфейсов, но это означает, что ваш класс соглашается реализовать сигнатуры, определенные этими интерфейсами. На самом деле вы не наследуете какую-либо функциональность от этих интерфейсов.

2

Один из способов смотреть на это так: C# имеет наследование дерева, в то время как C++ (или других языков Muliple-наследования) имеет наследование решетка.