C#
 Computer >> コンピューター >  >> プログラミング >> C#

C#のインターフェイス内でアクセス修飾子を指定できないのはなぜ?理由とC# 8での変更点を解説

インターフェイスのメソッドは、外部との間で交わされる「契約(コントラクト)」です。この契約により、インターフェイスを実装するクラスが特定の一連の処理を必ず行うことが保証されます。

インターフェイスのメンバーが常にpublicである理由

インターフェイスのメンバーは常にpublicとして扱われます。これは、インターフェイスの目的そのものが「他の型からクラスや構造体へアクセスできるようにする」ことにあるためです。もしメンバーがprivateやprotectedであれば、外部から呼び出せず、契約としての意味を成さなくなってしまいます。

一方で、インターフェイス自体にはinternalなどのアクセス修飾子を指定できます。これにより、「外部の世界」全体ではなく、その一部(同じアセンブリ内など)だけに公開範囲を限定することが可能です。

サンプルコード

interface IInterface
{
    void Save();
}

class Program
{
    static void Main()
    {
        Console.ReadLine();
    }
}

上記の例では、インターフェイスメンバーにアクセス修飾子を付けていないため、エラーなく正常にコンパイルされます。

C# 7.xまで:アクセス修飾子を付けるとコンパイルエラー

C# 8より前のバージョンでは、インターフェイスのメンバーは暗黙的にpublicでした。そのため、メンバーに対してアクセス修飾子を明示的に指定すると(たとえpublicであっても)、コンパイラエラーが発生していました。

interface IInterface
{
    public void Save(); // C# 7.xではコンパイルエラー
}

class Program
{
    static void Main()
    {
        Console.ReadLine();
    }
}

上記のコードはC# 7.0ではコンパイル時エラーとなりますが、C# 8.0以降では問題なくコンパイルできます。

C# 8.0以降:既定インターフェイス実装の登場

C# 8.0で導入された「既定インターフェイス実装(Default Interface Methods)」機能により、状況が変わりました。この機能では、インターフェイスのメソッドに既定の実装を持たせることができ、それに伴ってメンバーごとにアクセス修飾子を指定できるようになりました。これにより、実装を持つヘルパーメソッドなどを非公開にするなど、より柔軟な設計が可能になっています。

  1. パスワード認証はなぜ時代遅れなのか?知っておきたい代替セキュリティ技術5選

    パスワードには皮肉なジレンマがあります。複雑にすればするほど忘れやすくなり、覚えやすいものほど他人に推測されやすくなるのです。この矛盾はあまりにも明白で、ミッドナイト・シャイアマラン監督でも映画化をためらうほどの「どんでん返し」だと言えるかもしれません。 もちろん、映画のアイデアを提案したいわけではありません。しかし、パスワードによる保護がオンライン上の個人情報やアカウントを犯罪から守る手段として、何度もその限界を露呈してきたのは事実です。ここ数年、世界中のウェブを悩ませてきた大規模なデータ漏洩事件がその何よりの証拠です。データ漏洩やサイバー攻撃自体は新しい概念ではありませんが、私たちのオン

  2. Android 10にアップデートできない原因と解決方法を徹底解説

    Android 10にアップデートできない主な理由この記事にたどり着いたということは、Android 10へのアップデートに失敗した可能性が高いですね。最新バージョンのAndroidは先日公開されたばかりで、大きな話題を集めています。ゲームチェンジャーとなりうる新機能が多数搭載されていることがその理由です。最新バージョンを手に入れたい方のために、Android 10にアップデートできない基本的な原因を解説します。Google Pixelユーザーではない: Android 10のアップデートが表示されない場合、Google Pixelユーザーではないことが原因かもしれません。このバージョンは現時