|
|
連載:[完全版]究極の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 アクセス制御に注目した場合の継承/部分クラス/拡張メソッドの違い |
|
Insider.NET 記事ランキング
本日
月間