2011-03-31 33 views
11

¿Puedo dejar una clase abstracta que implementa interfaces vacías e implica que todos los métodos/propiedades en la interfaz son abstractos dentro de mi clase. Parece que tengo que escribirlos de nuevo en la clase abstracta, pero realmente quiero evitar esta duplicación.C# Interfaz implementada por clase abstracta vacía

Mi razón es que tengo un par de interfaces con diferentes descriptores de acceso, uno público y uno interno, que quiero juntar, así que tengo una clase abstracta que los implementa y luego puede ampliarlos.

public interface ISomePublicProperties { 
    int PropertyOne {get;} 
} 

internal interface ISomeInternalProperties { 
    int PropertyTwo {get;} 
} 

public abstract class SomeClass : ISomePublicProperties, ISomeInternalProperties {} 

Pero el compilador se queja de que no implementa SomeClass método de interfaz ISomePublicProperties.PropertyOne y ISomeInternalProperties.PropertyTwo

¿Hay alguna forma en C# (sé Java permite esto) que pueda salir de la clase abstracta vacío implementación interfaces?

+0

¿Ha intentado simplemente crear un método stub 'virtual' para cerrar el compilador? – FreeAsInBeer

Respuesta

15

No. En C#, la clase abstracta debe implementar completamente la interfaz. Tenga en cuenta que puede implementarlo con métodos abstractos y propiedades abstractas. Es una pequeña cosa sobre C# que siempre me ha molestado.

+0

Si bien puede implementar con propiedades abstractas, parece que no puede implementar * explícitamente * con propiedades abstractas. Lo siguiente se queja de que los miembros abstractos no pueden ser privados: "abstract int ISomePublicProperties.PropertyOne {get;}". Desgraciado. – yoyo

3

La única manera de hacerlo es crear virtual propiedades sin implementación. Estos son anulados en sus clases derivadas.

public abstract class SomeClass : ISomePublicProperties, ISomeInternalProperties 
{ 
    public abstract int PropertyOne { get; } 
    internal abstract int PropertyTwo { get; } 
} 
+0

Creo que quiere evitar tener algo como 'public abstract int Property {get; } ' – aqwert

+0

Tienes razón, por supuesto. He arreglado mi respuesta. –

+0

Gracias por las respuestas, pero realmente quería evitar la duplicación de las interfaces en la clase abstracta; solo quería que la clase abstracta estuviera vacía y los extendedores de la clase implementaran las interfaces. – kevin

Cuestiones relacionadas