連載:[完全版]究極のC#プログラミング

Chapter14 拡張メソッド

川俣 晶
2010/03/01

14.6 拡張メソッドはオブジェクト内部に手出しできない

 拡張メソッドの定義に立ち返って考えてみよう。リスト14.5に記述された拡張メソッドMyMethodは、クラスBに属している。1つのメソッドが2つのクラスに属することはないので、当然このメソッドはクラスAには属していない。ということは、メソッドMyMethodはクラスBのprivateやprotectedのメンバーにアクセスすることは許されているが、クラスAのprivateやprotectedのメンバーには手が出せない。

 この事実を、次のリスト14.8で確認してみよう。

using System;
using X;

namespace X
{
  static class B
  {
    // 拡張メソッド
    public static void MyMethod(this A a)
    {
      a.PublicMethod();

      a.protectedMethod();
      // エラー 1 'A.protectedMethod()'
      // はアクセスできない保護レベルになっています。

      a.privateMethod();
      // エラー1 'A.protectedMethod()'
      // はアクセスできない保護レベルになっています。
    }
  }
}

class A
{
  public void PublicMethod()
  {
    Console.WriteLine("PublicMethod called");
  }
  protected void protectedMethod()
  {
    Console.WriteLine("protectedMethod called");
  }
  private void privateMethod()
  {
    Console.WriteLine("privateMethod called");
  }
}

class Program
{
  static void Main(string[] args)
  {
    var a = new A();
    a.MyMethod();
  }
}
リスト14.8 拡張メソッドはオブジェクト内部には手出しできない

 この事実は、拡張メソッドは単に“あたかもそのクラスのメソッドであるかのように呼び出せるだけ”であり、実際にはクラスを拡張していないことを示す。それは、「a.MyMethod();」という呼び出しが、実際には「B.MyMethod(a);」でしかないことからもわかるだろう。

 ちなみに、部分クラス(partial)も、1つのクラス定義を複数のクラス定義に分割して記述できるので、これも含めて違いを把握するとよりわかりやすいだろう。

 表14.1に、アクセス制御に注目した場合の、継承、部分クラス、拡張メソッドの違いをまとめる。

public protected private
部分クラス(同じ名前を持つ別のクラス定義に対して)
継承(継承元の基本クラスに対して) ×
拡張メソッド(第1パラメータで示した型に対して) × ×
表14.1 アクセス制御に注目した場合の継承/部分クラス/拡張メソッドの違い


 INDEX
  [完全版]究極のC#プログラミング
  Chapter14 拡張メソッド
    1.14.1 C# 2.0プログラマーの悲劇
    2.14.2 Allメソッドを利用するのに必要な記述
    3.14.3 拡張メソッドの概要
    4.14.4 スイッチなしで機能する例
    5.14.5 sealedクラスを拡張する
  6.14.6 拡張メソッドはオブジェクト内部に手出しできない
    7.14.7 拡張メソッドはオブジェクトの振る舞いを変更できない
    8.14.8 拡張メソッドが安全である理由
    9.14.9 メソッド呼び出しと型の関係
    10.14.10 thisの正体
    11.14.11 拡張メソッドを使用すべきとき
    12.14.12 コレクションに拡張されるメソッド
    13.14.13 なぜ「using System.Linq;」なのか?/練習問題
 
インデックス・ページヘ  「[完全版]究極のC#プログラミング」

@IT Special

- PR -

TechTargetジャパン

Insider.NET フォーラム 新着記事
  • 第2回 簡潔なコーディングのために (2017/7/26)
     ラムダ式で記述できるメンバの増加、throw式、out変数、タプルなど、C# 7には以前よりもコードを簡潔に記述できるような機能が導入されている
  • 第1回 Visual Studio Codeデバッグの基礎知識 (2017/7/21)
     Node.jsプログラムをデバッグしながら、Visual Studio Codeに統合されているデバッグ機能の基本の「キ」をマスターしよう
  • 第1回 明瞭なコーディングのために (2017/7/19)
     C# 7で追加された新機能の中から、「数値リテラル構文の改善」と「ローカル関数」を紹介する。これらは分かりやすいコードを記述するのに使える
  • Presentation Translator (2017/7/18)
     Presentation TranslatorはPowerPoint用のアドイン。プレゼンテーション時の字幕の付加や、多言語での質疑応答、スライドの翻訳を行える
@ITメールマガジン 新着情報やスタッフのコラムがメールで届きます(無料)
- PR -

イベントカレンダー

PickUpイベント

- PR -

アクセスランキング

もっと見る

ホワイトペーパーTechTargetジャパン

注目のテーマ

Insider.NET 記事ランキング

本日 月間
ソリューションFLASH