C#プログラム

【C#3.0~】拡張メソッド

C#3.0(Visual Studio 2008)からは、拡張メソッドよ呼ばれる、既存の型やクラスにメソッドを追加することが出来るようになりました。

 

と、聞くと、クラスを継承すれば出来るでしょ!という意見があろうかと思いますが、拡張メソッドでは、そもそも継承できない sealed のクラスに対しても、元の型やクラスを変更することなく、メソッドを追加することが出来ます。

 

この拡張メソッドの記述方法は

staticクラスに、staticのメソッド(これが拡張メソッドとなる)を追加し、最初の引数に拡張元の型やクラスの引数を書き、型やクラスの前に this を付けます。

 

具体的には以下のようになります。

static class ExtensionMethod
{
    public static void ScaleAt(
        this System.Drawing.Drawing2D.Matrix matrix, 
        float scaleX, 
        float scaleY, 
        System.Drawing.PointF point
        )
    {
        // 原点へ移動
        matrix.Translate(-point.X, -point.Y, System.Drawing.Drawing2D.MatrixOrder.Append);
        // 倍率変換
        matrix.Scale(scaleX, scaleY, System.Drawing.Drawing2D.MatrixOrder.Append);
        // 元の位置へ戻す
        matrix.Translate(point.X, point.Y, System.Drawing.Drawing2D.MatrixOrder.Append);
    }
}

この例は、System.Drawing.Drawing2D.Matrixクラスに、指定した点を中心に拡大縮小を行うメソッド(ScaleAt)を追加しています。

(指定した点を中心に回転するRotateAtメソッドはあるのに何で??と思っていたんですよ)

 

この拡張メソッドを使用する側では、以下のように、通常のMatrixクラスのRotateAtメソッドと同じように、今回拡張したメソッド(ScaleAt)を使う事が出来るようになります。


var mat = new System.Drawing.Drawing2D.Matrix();

// (20,30)を中心に30°回転(通常のメソッド)
mat.RotateAt(30, new PointF(20, 30), System.Drawing.Drawing2D.MatrixOrder.Append);

// (100, 150)を中心にX方向に2倍、Y方向に3倍(拡張メソッド)
mat.ScaleAt(2, 3, new PointF(100, 150));

 

← C#2.0からの脱却 へ戻る

コメント

タイトルとURLをコピーしました