いろいろ備忘録日記

主に .NET とか Go とか Flutter とか Python絡みのメモを公開しています。

部分メソッド (Partial Method)


今日しりました。partialのメソッド版なんてあったんだ。


あまり、使いどころが今のところ思いつかないですが・・・w


意味合いとしては、クラスがpartialできるのと同じような感じです。
ただし、制約が多いです。

  • メソッド定義はpartialではじめる必要がある。
  • 戻り値はvoidでないとダメ。
  • 暗黙的にprivateとなる。(つまりvirtualには出来ない。)

などなど。


クラスAには、メソッドの定義のみをpartialで書いておき
クラスBに、メソッド本体を定義できたりします。
面白いのが、定義だけしておいて、実装が無い場合は
コンパイラによって、定義部分と呼び出しの部分が全部削除されます。
つまり、定義しかない場合でもそのまま動くようにできるということです。


以下サンプルです。

// vim:set ts=4 sw=4 et ws is nowrap ft=cs:
using System;
using System.Windows.Forms;

namespace Gsf.Demo{

    partial class A{

        //
        // partialメソッドの定義.
        //
        partial void PartialMethod();

        //
        // 外から呼ぶ為のメソッド.
        //
        public void CallPartialMethod(){
            PartialMethod();
        }
    }

    partial class A{

        //
        // partialメソッドの実装.
        //
        partial void PartialMethod(){
            MessageBox.Show("Call Partial Method.");
        }
    }

    public class DemoForm : Form{

        public DemoForm(){
            InitializeComponent();
        }

        protected void InitializeComponent(){

            Load += (s, e) => {
                (new A()).CallPartialMethod();
            };
        }

        [STAThread]
        static void Main(){
            Application.EnableVisualStyles();
            Application.Run(new DemoForm());
        }
    }
}

実行すると、メッセージボックスが表示されます。つまりpartialなメソッドが
呼ばれている事になります。
その後、PartialMethodメソッドを実装している2つ目のpartialクラスにて
該当メソッドを全部コメントアウトしてメソッドの実装を消します。


そのままコンパイルするとエラーも出ずに終了し、実行すると何事もなかったかのように
動作します。ただし、実装を削除したのでメッセージボックスは表示されないようになります。