Meu código de teste em c #:
namespace DSnA
{
public abstract class Test : IComparable
{
}
}
Resultados no seguinte erro do compilador:
error CS0535: 'DSnA.Test' does not implement interface member
'System.IComparable.CompareTo(object)'
Como a classe Test
é uma classe abstrata , por que o compilador exige que ele implemente a interface? Este requisito não deveria ser obrigatório apenas para classes concretas?
c#
syntax
interface
abstract-class
bguiz
fonte
fonte
Respostas:
Em C #, uma classe que implementa uma interface é necessária para definir todos os membros dessa interface. No caso de uma classe abstrata, você simplesmente define esses membros com a
abstract
palavra-chave:Ou, de outra forma: você não precisa "implementá- lo " (o que seria uma limitação terrível para as classes abstratas); no entanto, em C #, você precisa informar ao compilador que está deliberadamente passando o fanfarrão para subclasses de concreto - e a linha de código acima mostra como fazer isso.
Os comentários e votos negativos queixam-se de que essa não é uma resposta à pergunta estão perdendo o objetivo. Alguém vindo ao Stack Overflow, tendo recebido esse erro do compilador, mas tendo uma classe abstrata na qual seria um erro fornecer uma implementação, fica preso sem uma boa solução - teria que escrever métodos de implementação que gerassem exceções de tempo de execução, um trabalho horrendo -around - até que tenham as informações acima. Se é bom ou ruim que o C # exija essa explicitação, está fora do escopo do Stack Overflow e não é relevante para a pergunta nem para esta resposta.
fonte
Foo
parapublic abstract void IFoo.Bar();
e você receberá reclamações de que "público" e "abstrato" não são modificadores válidos.Diferentemente de Java, em C #: "uma classe abstrata deve fornecer implementações de todos os membros das interfaces listadas na lista de classes base da classe. No entanto, uma classe abstrata é permitida para mapear métodos de interface em métodos abstratos."
https://msdn.microsoft.com/en-us/library/Aa664595(v=VS.71).aspx
fonte
Eles não precisam realmente implementar a interface .
Os métodos / propriedades da interface podem ser abstratos ou mesmo virtuais. Portanto, cabe às subclasses implementá-las.
fonte