Mi código de prueba en C #:
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)'
Dado que la clase Test
es una clase abstracta , ¿por qué el compilador requiere que implemente la interfaz? ¿No debería ser obligatorio este requisito solo para clases concretas?
c#
syntax
interface
abstract-class
bguiz
fuente
fuente
Respuestas:
En C #, se requiere una clase que implemente una interfaz para definir todos los miembros de esa interfaz. En el caso de una clase abstracta, simplemente define esos miembros con la
abstract
palabra clave:O para decirlo de otra manera: no tiene que "implementarlo" (lo que sería una limitación terrible en las clases abstractas); sin embargo, en C #, tiene que decirle al compilador que está pasando deliberadamente el dinero a subclases concretas, y la línea de código anterior muestra cómo hacerlo.
Los comentarios y votos negativos quejándose de que esto no es una respuesta a la pregunta están perdiendo el punto. Alguien que viene a Stack Overflow, que recibió este error de compilación, pero que tiene una clase abstracta en la que sería un error proporcionar una implementación, está atrapado 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 explicidad está fuera del alcance de Stack Overflow, y no es relevante para la pregunta ni esta respuesta.
fuente
Foo
apublic abstract void IFoo.Bar();
y obtendrá quejas de que "público" y "abstracto" no son modificadores válidos.A 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, una clase abstracta puede mapear métodos de interfaz en métodos abstractos".
https://msdn.microsoft.com/en-us/library/Aa664595(v=VS.71).aspx
fuente
No tienen que implementar realmente la interfaz .
Los métodos / propiedades de la interfaz pueden ser abstractos o incluso virtuales también. Entonces depende de las subclases implementarlas realmente.
fuente