2010-04-24 18 views
108

Mi código de prueba en C#:C#: ¿Las clases abstractas necesitan implementar interfaces?

namespace DSnA 
{ 
    public abstract class Test : IComparable 
    { 

    } 
} 

Resultados en el siguiente error del compilador:

error CS0535: 'DSnA.Test' does not implement interface member 
'System.IComparable.CompareTo(object)' 

Puesto que la clase Test es una clase abstracta , ¿por qué el compilador lo requieran para implementar la interfaz ? ¿No debería este requisito ser solo obligatorio para clases concretas?

+0

Haha. Escribí una cosa y luego decidí cambiarla. Lo siento. :) – Joel

+0

Basado en los votos a favor y en los comentarios sobre la respuesta aceptada, creo que los votos a favor vienen por la forma en que está formulada la pregunta. OP pregunta "¿por qué es así?", Que estaría fuera del alcance de stackoverflow. Habiéndome encontrado esto yo mismo, la pregunta es más como "¿Me estoy perdiendo algo? ¿De verdad tengo que proporcionar implementaciones? ¿Eso no le gana al punto de ser una clase abstracta?" A lo que la respuesta es "No, no tienes que proporcionar * implementaciones * (lo que violaría el propósito de una clase abstracta), pero esto es lo que tienes que hacer para que tu situación funcione". – ToolmakerSteve

Respuesta

96

En C# aún define los métodos, pero no proporciona un cuerpo y lo marca como abstracto. De este modo:

interface IFoo 
{ 
    void Bar(); 
} 

abstract class Foo : IFoo 
{ 
    public abstract void Bar(); 
} 

O, para decirlo de otra manera: que no tiene que "aplicar" (lo que sería una terrible limitación de las clases abstractas); sin embargo, en C#, usted tiene que decirle al compilador que está pasando deliberadamente el dinero a las subclases de concreto, y la línea de código anterior muestra cómo hacerlo.

[Los comentarios y votos negativos que se quejan de que esta no es una respuesta a la pregunta carecen de sentido. Alguien que viene a stackoverflow, habiendo recibido este error de compilación, pero teniendo una clase abstracta en la que sería un error proporcionar una implementación, está atascado sin una buena solución, tendría que escribir métodos de implementación que arrojaran excepciones de tiempo de ejecución, un trabajo horrendo. alrededor - hasta que tengan la información anterior. Si es bueno o malo que C# requiera esta explicitud está fuera del alcance de stackoverflow, y no es relevante para la pregunta ni esta respuesta.]

+0

Estoy buscando una respuesta similar, pero en mi caso tengo 2 interfaces (por ejemplo, IFoo1 y IFoo2) con el mismo nombre de método y estoy teniendo algunos problemas marcándolos como abstractos en mi clase base (abstracta). ¿Puede usted ayudar? – Ben

+0

No explica por qué el heredero abstracto no necesita implementar miembros abstractos base. – AgentFire

+2

@Ben Acabo de ver tu comentario. Probablemente ya lo hayas descifrado, pero en caso de que alguien más lo necesite. Consulte Implementaciones explícitas de interfaces: http://msdn.microsoft.com/en-us/library/ms173157.aspx – Joel

3

No tienen que implementar realmente la interfaz.
Los métodos/propiedades de la interfaz también pueden ser abstractos o incluso virtuales. Por lo tanto, depende de las subclases implementarlas realmente.

7

diferencia de Java, en C#:. "una clase abstracta debe proporcionar implementaciones de todos los miembros de las interfaces que se enumeran en la lista de la clase base de la clase Sin embargo, se permite una clase abstracta para mapear los métodos de interfaz a los métodos abstractos "

https://msdn.microsoft.com/en-us/library/Aa664595(v=VS.71).aspx

+1

Respuesta súper clara y excelente que brinde ambas situaciones, como también podría querer implementar el comportamiento en la clase base – VinKel

+0

. Una pregunta que surge aquí es: ¿por qué estas declaraciones repetitivas de C# (que obviamente lo son) deben existir en clases abstractas, que de otro modo podrían ser concisas y más cortas?)? En mi proyecto de C# tengo muchas clases e interfaces abstractas, y lo que hago por la mayor parte del tiempo es copiar y pegar declaraciones de métodos en Visual Studio. – forsberg

Cuestiones relacionadas