C # : 추상 클래스는 인터페이스를 구현해야합니까? } } 다음과 같은 컴파일러 오류가

C #의 테스트 코드 :

namespace DSnA
{
    public abstract class Test : IComparable
    {

    }
}

다음과 같은 컴파일러 오류가 발생합니다.

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

클래스 Test추상 클래스 이기 때문에 왜 컴파일러가 인터페이스를 구현하기 위해 클래스를 요구합니까? 이 요구 사항이 구체적인 수업에 대해서만 의무적 이지 않아야 합니까?



답변

C #에서 인터페이스를 구현하는 클래스 는 해당 인터페이스의 모든 멤버를 정의 해야 합니다. 추상 클래스의 경우 abstract키워드를 사용하여 해당 멤버를 정의하면됩니다 .

interface IFoo
{
    void Bar();
}

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

아니면 다른 방법을 넣어 : 당신이 하지 에있다 “구현” (추상 클래스에 끔찍한 제한 될 것이다) 그; 그러나 C #에서는 컴파일러에게 의도적으로 벅을 구체적인 서브 클래스로 전달한다고 알려 주어야합니다. 위의 코드 행은 그렇게하는 방법을 보여줍니다.

이것이 질문에 대한 답변이 아니라고 불평하는 의견과 공감대는 요점이 없습니다. 누군가가 스택 오버플로에 와서이 컴파일러 오류를 받았지만 구현을 제공하는 데 실수가되는 추상 클래스가 있으면 좋은 해결책없이 고착됩니다. 런타임 예외를 발생시키는 구현 방법을 작성해야합니다. 끔찍한 작업 -약속-위의 정보를 얻을 때까지 C #에서 이러한 명시 성을 요구하는 것이 좋든 나쁘 든 스택 오버플로의 범위를 벗어나며 질문이나 대답과 관련이 없습니다.


답변

Java와는 달리 C #에서 : “추상 클래스는 클래스의 기본 클래스 목록에 나열된 모든 인터페이스 멤버의 구현을 제공해야하지만 추상 클래스는 인터페이스 메소드를 추상 메소드에 맵핑 할 수 있습니다.”

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


답변

실제로 인터페이스를 구현할 필요는 없습니다 .
인터페이스 방법 / 속성은 추상적이거나 가상적 일 수도 있습니다. 따라서 실제로 구현하기 위해 서브 클래스에 달려 있습니다.