Home > Study > [C#] 拡張メソッドでちょっとコードをきれいにする

[C#] 拡張メソッドでちょっとコードをきれいにする

点と点の距離や中点をとる場合などに、Point型をPointF型に簡単に変換できたら便利。そのためのメソッドは、こんな感じになるだろう。

public PointF PointToPointF(Point p)
{
    return new PointF((float)p.X, (float)p.Y);
}

けど、こんなメソッドが増えてくると、なんだか全体のコードの見通しが悪くなって気持ち悪い。ユーティリティー系メソッドを別ファイルにしてまとめておくというのもアリだが、PointToPointF() という名前がなんともはや(Delphi ならこれでもいい気がするけど)。

できれば、i.ToString() みたいに p.ToPointF() なんて書ければいいのだが。

C#3.0 なら拡張メソッドを使うことで、簡単に(継承を使わずに)既存のクラスへ新しいメソッドを付け加えることが出来るらしい。

public static class PointClassExtension
{
    public static PointF ToPointF(this Point p)
    {
        return new PointF((float)p.X, (float)p.Y);
    }

    public static double DistanceFrom(this Point p1, PointF p2)
    {
        return Math.Sqrt(
            Math.Pow((float)p1.X - p2.X, 2) +
            Math.Pow((float)p1.Y - p2.Y, 2));
    }
}

static を使うんですね。なんかあんまりイケてない記法な気もするけど、これでp.ToPointF() という書き方が出来る。Rubyチックな感じ(ほかのスクリプト言語もそうなんだろうか?少なくとも Javascript でもできるなぁ)。ここではついでに、2点間の距離を求めるメソッドも加えてみた。p.DistanceFrom(anotherP) で p と anotherP 間の距離が返ってくる。オーバーロードしてPoint型をとれるようにしてもよさげ。

PS:

float と int の加算減算って float型で返ってくるんだっけ?こういうところ、ちょっと分かってないので不安だったりする。

Home > Study > [C#] 拡張メソッドでちょっとコードをきれいにする

My Friend Feed

http://friendfeed.com/daruyanagi

Google Analyticator

608
 Unique Visitors 
 (1 day) 
Powered By Google Analytics

Return to page top