2008-10-10 24 views
8

Me he estado haciendo esta pregunta por mucho tiempo. Pensé en publicarlo. C# no admite Herencia Múltiple (este es el hecho). Todas las clases creadas en C# derivan de la clase 'Objeto' (de nuevo un hecho).Herencia única en C# - ¿clase de objeto?

Entonces, si C# no es compatible con la herencia múltiple, ¿cómo podemos extender una clase aunque ya se extienda a la clase Object?

Illustating con un ejemplo:

  1. clase A: objeto - Clase A creado.
  2. clase B: objeto - Clase B creada.
  3. clase A: B: esto también es compatible. ¿Qué le sucede a la asociación anterior para objetar?

Podemos utilizar los métodos de clase de objeto en A después del paso 3. Lo mismo ocurre con la herencia de niveles múltiples. Si ese es el caso, entonces

  1. clase A: B
  2. clase C: B
  3. clase A: C - Debo ser capaz de acceder a los métodos de la clase de B en A. Lo cual no es el caso?

¿Alguien puede explicarlo?

Respuesta

6

La respuesta de Joel es correcta. Hay una diferencia entre la herencia múltiple y un árbol de inherencia (o cadena de derivación). En su ejemplo, realmente muestra un árbol de inercia: un objeto hereda (deriva) de otro objeto más arriba en el árbol. La herencia múltiple permite que un objeto herede de múltiples clases base.

Tomemos, por ejemplo, el siguiente árbol:

public class BaseClass { } 

public class SpecialBaseClass : BaseClass {} 

public class SpecialtyDerivedClass : SpecialBaseClass {} 

Esto es perfectamente válido y dice que SpecialtyDerivedClass hereda de SpecialBaseClass (matriz que, a su vez, deriva de BaseClass (SpecialtyDerivedClass SpecialtyDerivedClass) abuelo).

Bajo la idea de la herencia múltiple, el ejemplo sería el siguiente:

public class BaseClass { } 

public class SpecialBaseClass {} 

public class SpecialtyDerivedClass : BaseClass, SpecialBaseClass {} 

Esto no está permitido en .NET, pero dice que SpecialityDerivedClass hereda de ambos BaseClass y SpecialBaseClass (que son ambos padres) .

.NET permite una forma de herencia múltiple al permitirle heredar de más de una interfaz. Cambiar el ejemplo anterior levemente:

public class BaseClass { } 

public interface ISpecialBase {} 

public interface ISpecialDerived {} 

public class SpecialtyDerivedClass : BaseClass, ISpecialBase, ISpecialDerived {} 

Esto dice que SpecialtyDerivedClass hereda de BaseClass (que es la matriz) y también ISpecialBase y ISpecialDerived (también de los padres, pero más como padrastros como interfaces no pueden especificar la funcionalidad).

+1

Mi confusión fue que no pude ver que la clase System.Object se convierte en un gran padre después de la herencia de A: B. Gracias por la aclaración. –

7

Estás confundiendo la herencia mutliple con un árbol de herencia. Puedes heredar de algo que no sea Object. Es solo que Object está sentado arriba en la parte superior de tu árbol. Y alguien puede heredar tu clase, pero dado que Object sigue ahí arriba, esa clase también heredará del objeto. Su herencia de "niveles múltiples" no es herencia múltiple.

La herencia múltiple es cuando heredas de dos árboles diferentes, y .Net en realidad lo admite después de una moda a través de interfaces.

+0

C# no es compatible con herencia múltiple, pero admite múltiples interfaces. Solo puede heredar solo de 1 objeto. –

+0

Es solo semántica. La implementación de una interfaz _es_ una forma débil de herencia. –

+0

Sustituya "rama de un árbol" por árbol y omita la parte relativa a la implementación de interfaces como herencia. La implementación de una interfaz solo significa que su clase garantiza que definirá una firma. No heredas ningún código de una interfaz. Pero, dijiste "después de una moda", entonces, supongo ... – tvanfosson

0

A continuación.

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; 
    } 

} 

Esto es válido. Object es una base para C en este caso.

4

Todas las clases finalmente provienen de Object.

public class A 

es implícita equivalente a

public class A : System.Object 

Al derivar de otra clase

public class A : B 

donde

public class B : System.Object 

B se convierte en la clase padre, y el objeto se convierte en el abuelo clase .

Y así sucesivamente.

Así es la clase de padres, abuelos, bisabuelos (etc.) de todas las demás clases.

0

En el ejemplo, la razón por la que B puede extender A es porque A extiende el objeto. Una clase solo puede especificar una clase principal, pero esa clase debe ser objeto o tener un objeto como uno de sus antecesores.

0

Una clase hereda del objeto si no especifica una clase base. Por lo tanto:

class C {} 

es lo mismo que

class C : Object {} 

Sin embargo, si se especifica una clase base, se heredarán de esa clase de objetos en lugar de. Por lo tanto,

class B : C {} 

B hereda directamente de C en lugar de Object. Otro ejemplo,

class A : B {} 

En este caso, A hereda de B en lugar de Object. Para resumir, en esta jerarquía:

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

Clase A se deriva de B, que se deriva de C. Así Clase A se deriva indirectamente a partir de C porque B se deriva de C. C también derivado de objeto que en no especificado explícitamente pero está ahí por defecto. Entonces A también se deriva indirectamente de Object.

+0

Una clase siempre heredará del objeto, incluso cuando especifique su propia clase base. –

+0

Sí, en última instancia, pero no directamente. Creo que lo he explicado en el último párrafo. – jop

0

Una clase en C# solo puede tener un elemento primario, pero puede tener varios antepasados. Puede implementar múltiples interfaces, pero eso solo significa que su clase acepta implementar las firmas definidas por esas interfaces. En realidad, no heredas ninguna funcionalidad de esas interfaces.

2

Una forma de verlo es la siguiente: C# tiene una herencia árbol, mientras que C++ (u otros idiomas Muliple-herencia) tiene una herencia celosía.