2012-10-02 39 views
7

¿es posible implementar esta funcionalidad? tengo dos clases abstractas, y quiero forzar una tercera clase para implementar todos los métodos abstractos en las dos clases.net Herencia múltiple de las clases abstractas

public abstract class A 
{ 
    private void MethodA() 
    { 
     var fool = Prop*2; 
    } 
    public abstract int Prop { get; } 
} 
public abstract class B 
{ 
    private void MethodB() 
    { 
     //.... 
     SomeMethod(); 
     //.... 
    } 
    public abstract void SomeMethod(); 
} 

public class C: A, B 
{ 
    public int Prop { .... } 
    public void SomeMethod { .... } 
} 

El principal problema aquí es que los métodos de la clase última implementadas se utilizan luego en la base clases abstractas, y esto no se puede lograr con interfaces. Entonces, ¿no hay una solución alternativa?

He leído muchos q similares pero no hay nada que responda a mi problema. Gracias

+0

Como dijo Claudio, la herencia múltiple no está permitida. He aquí una buena lectura sobre el tema: http://blogs.msdn.com/b/dachou/archive/2008/04/17/net-and-multiple-inheritance.aspx – Gromer

Respuesta

10

No, C# no admite herencia múltiple. Puede implementar múltiples interfaces, pero obviamente no es lo mismo, ya que las interfaces no pueden tener un comportamiento concreto implementado.

+0

El principal problema aquí es que la clase final implementada los métodos se usan luego en clases abstractas básicas, y esto no se puede lograr con interfaces. Entonces, ¿no hay una solución alternativa? –

+3

@Michele Virgilio: me temo que la respuesta corta es que no hay ninguna solución excepto un nuevo diseño de sus clases. –

1

¿Eso específicamente? No, ya que la herencia múltiple no es compatible con C#.

Lo más cerca que podría conseguir sería el uso de una interfaz que combina otras dos:

public interface ISomeInterfaceA 
{ 
    int Prop { get; } 
} 

public interface ISomeInterfaceB 
{ 
    void SomeMethod(); 
} 

public interface ICombined : ISomeInterfaceA, ISomeInterfaceB 
{ 

} 

Posteriormente, se podría requerir argumentos de tipo ICombined, pero esto no consigue completamente lo que está buscando. Por ejemplo, si tuviera que hacer esto:

public class A : ISomeInterfaceA, ISomeInterfaceB 
{ 
    ... 
} 

Esto no tendría derecho, ya que no explícitamente implementar la interfaz combinada, sólo las dos interfaces que se componen.

0

Si usted está dispuesto a implementar la funcionalidad de la clase final, puede crear interfaces y poner en práctica todas las que desee ...

2

Usted puede hacer esto en C# a través de Mixins, se implementa de manera diferente a la herencia múltiple pero al final obtienes un objeto con todos los métodos de varias clases.

No es una función del idioma, pero se puede encontrar en terceros.

Usted puede leer sobre él en my answer to this other question, o directamente en re-mix's codeplex

Algunos puntos de interés:
- se puede sustituir métodos en un Mixin, por tanto, modificar externamente el comportamiento de las clases de nueva creación.
- puede crear ámbitos donde las clases sean diferentes mientras se crean dentro del alcance.
- necesita crear objetos mezclados a través de una fábrica (el nuevo MyObject() no tendrá en cuenta a Mixins, afortunadamente).