2010-07-11 33 views
8

Tengo una interfaz para que los escritores de clase se vean obligados a implementar ciertos métodos. También quiero permitir algunos métodos implementados por defecto, así que creo una clase abstracta. El problema es que todas las clases heredan de la clase base, así que tengo algunas funciones auxiliares allí.clase abstracta no implementa interfaz

Intenté escribir: IClass con la base abstracta, pero me llegó el error de que la base no implementaba la interfaz. Bueno, por supuesto, porque quiero este resumen y para que los usuarios implementen esos métodos. Como objeto de retorno si uso base, no puedo llamar a los métodos de clase de interfaz. Si utilizo la interfaz no puedo acceder a los métodos básicos.

¿Cómo hago para que pueda tener estas clases de ayuda y obligue a los usuarios a implementar ciertos métodos?

Respuesta

6

Mueva los métodos de interfaz a la clase abstracta y declare también abstractos. Por esto, las clases derivadas se ven obligadas a implementarlas. Si desea un comportamiento predeterminado, use clases abstractas, si solo desea que se corrija la firma, use una interfaz. Ambos conceptos no se mezclan.

15

Asegúrese de que los métodos de la clase base tengan el mismo nombre que la interfaz y que sean públicos. Además, hazlos virtuales para que las subclases puedan anularlos sin ocultarlos.

interface IInterface { 
    void Do(); 
    void Go(); 
} 

abstract class ClassBase : IInterface { 

    public virtual void Do() { 
     // Default behaviour 
    } 

    public abstract void Go(); // No default behaviour 

} 

class ConcreteClass : ClassBase { 

    public override void Do() { 
     // Specialised behaviour 
    } 

    public override void Go() { 
     // ... 
    } 

} 
0

Después de haberme enfrentado con el mismo problema recientemente, se me ocurrió una solución algo más elegante (en mi opinión). Parece que:

public interface IInterface 
{ 
    void CommonMethod(); 
    void SpecificMethod(); 
} 

public abstract class CommonImpl 
{ 
    public void CommonMethod() // note: it isn't even virtual here! 
    { 
     Console.WriteLine("CommonImpl.CommonMethod()"); 
    } 
} 

public class Concrete : CommonImpl, IInterface 
{ 
    void SpecificMethod() 
    { 
     Console.WriteLine("Concrete.SpecificMethod()"); 
    } 
} 

Ahora, de acuerdo con la especificación de C# (. 13.4.4 mapeo Interface), en el proceso de asignación de IInterfaceConcrete clase, compilador mejorar para CommonMethod en CommonImpl también, y que doesn' ¡Incluso debe ser virtual en la clase base!

La otra ventaja importante, en comparación con la solución de Mau, es que no tiene que enumerar todos los miembros de la interfaz en la clase base abstracta.

+0

Prefiero la solución de Mau. Es explícito y hace que el compilador haga el trabajo de conformidad para usted. En esta solución, puede olvidarse de agregar la IInterface a la clase derivada. – PlayTank

+0

@PlayTank: ... y eventualmente fallará en alguna conversión implícita, también en tiempo de compilación. Aunque estoy de acuerdo en que la solución carece de rigor articulado. – vines

Cuestiones relacionadas