web-dev-qa-db-ja.com

C#:抽象クラスはインターフェイスを実装する必要がありますか?

C#での私のテストコード:

namespace DSnA
{
    public abstract class Test : IComparable
    {

    }
}

次のコンパイラエラーが発生します。

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

クラスTestabstract classであるため、コンパイラがインターフェイスを実装する必要があるのはなぜですか?この要件は、具体的なクラスでは必須だけではいけませんか?

123
bguiz

C#では、インターフェイスを実装するクラスは必須であり、そのインターフェイスのすべてのメンバーを定義します。抽象クラスの場合、abstractキーワードを使用してこれらのメンバーを単純に定義します。

interface IFoo
{
    void Bar();
}

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

または、別の言い方をすれば:してはいけない "implement"それ(抽象クラ​​スのひどい制限になります);ただし、C#では、コンパイラーに、具体的なサブクラスに意図的に降圧を渡していることを伝える必要があります。上記のコード行は、そうする。

これが質問に対する答えではないと不満を述べているコメントと下票は、ポイントを失っています。このコンパイラエラーを受け取ったが、実装を提供するのが間違いになる抽象クラスを持っているStack Overflowに来た人は、良い解決策なしで立ち往生しています-ランタイム例外を投げる実装メソッドを書く必要があります-around-上記の情報が得られるまで。 C#がこの明示性を必要とすることが良いか悪いかは、スタックオーバーフローの範囲外であり、質問やこの回答には関係ありません。

129
Joel

Javaとは異なり、C#では、「抽象クラスは、クラスの基本クラスリストにリストされているインターフェイスのすべてのメンバーの実装を提供する必要があります。ただし、抽象クラスは、インターフェイスメソッドを抽象メソッドにマッピングできます。」

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

10
00jt

実際にインターフェースを実装する必要はありません
インターフェースのメソッド/プロパティは抽象的でも仮想的でもかまいません。したがって、実際に実装するのはサブクラスです。

4
ntziolis