2013-12-22 4 views
2

Я просто прочитал, где этот класс C# не может наследовать от нескольких классов, в то же время я также читал, что каждый класс C# наследуется от базового класса «Класс объекта».Confused on multiple inheritance

Теперь я смущен, если я делаю еще один класс, чтобы он наследовал некоторый класс, то он наследуется от класса и базового класса, т. Е. Из двух классов.

Разве это не нарушает закон?

+1

Класс объекта является родительским. Но у него слишком много внуков. –

+1

Объект -> String (Inherits from Object) -> MyClass: String (Inherits from String) .... Каждый из них только наследует от своего родителя –

ответ

9

Каждый класс наследуется от другого класса. Если вы сделаете свой собственный класс расширенным одним из ваших других классов, то он не будет напрямую наследоваться от Object, а скорее из вашего суперкласса. Суперкласс в свою очередь унаследует от Object.

Ваш подкласс будет иметь все методы от Object, доступные через суперкласс.

Это проиллюстрирует его:

void Main() 
{ 
    Console.WriteLine (new Super().GetType().BaseType); 
    Console.WriteLine (new Sub().GetType().BaseType); 
} 

class Super { } 
class Sub : Super { } 

Выход:

enter image description here

+1

+1 для части кода в ответе ... –

+0

Pedantic note : Класс объекта наследуется от нулевых классов. – Brian

0

Один класс может наследовать от одного другого класса непосредственно и реализовать несколько интерфейсов.
Вы можете связать наследование, например, класс a наследует от класса b, а класс c наследует от класса a.

interface i {} 
class a {} 
class b : a {} // OK 
class c : i,b {} // OK 
class d : a,b {} // Not OK 
1

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

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

0

Множественное наследование означает, что дерево наследования класса может быть разветвлено по желанию (т. Е. Оно может наследовать более чем из нескольких базовых классов одновременно). Это (слава богу) невозможно в C#.

Но до тех пор, пока дерево наследования всегда имеет только одну «верхнюю ногу», оно может быть столь же глубоким, как требуется (т. Е. Существует нечто вроде цепочки наследования, где один класс наследуется от другого).

9

Это возможно в C#:

enter image description here

(один базовый класс в производном классе, так называемый "единый inheritance")

Это невозможно в C#:

enter image description here

(Multiple inheritance, используйте interfaces вместо этого в C#)

0

Это не нарушает правила.

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

public class MyClass {} // extends from default Object class 

будет точно такой же, как и

public class MyClass : object {} 

Или, когда автор хочет продлить указанный класс:

public class MyClass : AnyBaseClass {} 
6

Я просто прочитал некоторые, где, что C# класс может 't наследуется от нескольких классов, в то же время я также читаю, что каждый класс C# наследуется от базового класса «Object». Теперь я запутался.

Каждый C# класс, кроме объекта наследует непосредственно от ровно один другого класса. Объект наследуется от класса.

Класс C# может наследовать косвенно из любого (неотрицательного!) Количества классов.

class Animal : Object {} 
class Giraffe : Animal {} 

Согласны ли наши правила? Да. Объект наследуется от класса. Животное наследует непосредственно от Объекта и косвенно из класса. Жираф наследует непосредственно от Животных и косвенно от Объекта.

Это устраняет противоречие.