はじめに
今回は,前回に引き続いて.NETプログラミングの基本とも言えるオブジェクト指向プログラミングについてをご説明していきたいと思います。
イベントを発生させるクラスを作る
以下は,前項のRowクラスから継承されているNotifyPropertyChangedクラスのコードです。
using System.ComponentModel;
namespace WindowsFormsApplication1
{
//*************************************************************
/// <summary>値が変わったことを通知するクラスです</summary>
//*************************************************************
class NotifyPropertyChanged : INotifyPropertyChanged
{
//*************************************************************
/// <summary>PropertyChanged イベント</summary>
//*************************************************************
public event PropertyChangedEventHandler PropertyChanged;
protected virtual void OnPropertyChanged(string propertyName) {
if (this.PropertyChanged == null) return;
object sender = this;
PropertyChangedEventArgs e
= new PropertyChangedEventArgs(propertyName);
this.PropertyChanged(sender, e);
}
}
}
インターフェイスの継承
このクラスは,INotifyPropertyChangedインターフェイスを継承しています。 INotifyPropertyChangedは,.NET Frameworkで用意されているインターフェイスでSystem.ComponentModel名前空間に属しています。
インターフェイスとは,現段階では「実装を持たないメンバが定義されているクラス」と理解していただければよいでしょう。 実装を持たないメンバを持つクラスを継承するのですから,当然のことながらインターフェイスを継承したクラスがその実装を持たなければなりません。 このクラスの場合は,以下が実装部分になります。
public event PropertyChangedEventHandler PropertyChanged;
なお,PropertyChangedEventHandlerもSystem.ComponentModel名前空間に属する,あらかじめ用意されているイベントハンドラです。
イベント発生メソッド
以下は,イベントを発生させるためのメソッドです。 最初の引数には自分自身のオブジェクトを,次の引数はPropertyChangedEventArgsオブジェクトを生成して値を渡しています。
protected virtual void OnPropertyChanged(string propertyName) {
if (this.PropertyChanged == null) return;
object sender = this;
PropertyChangedEventArgs e
= new PropertyChangedEventArgs(propertyName);
this.PropertyChanged(sender, e);
}
このメソッドでは,PropertyChangedイベントハンドラがnull(空の状態)でなければ,PropertyChangedイベントを発行しています。
protectedアクセス修飾子は,このクラスを継承したクラスのみに公開されることを示します。 例えば,前項のRowクラスはNotifyPropertyChangedから派生していたためOnPropertyChangedメソッドを呼び出すことができました。 しかしNotifyPropertyChangedクラスを継承していないクラスでは,OnPropertyChangedメソッドを呼び出すことはできません。
virtualキーワードは,このメソッドが継承したクラスによってoverrideすることを許可するという意味です。 overrideによって,元のメソッドを新しいメソッドで上書きできます。
例えば,以下はOnPropertyChangedメソッドをoverrideすることでpropertyNameの値が "" 以外の時だけ継承元クラスのOnPropertyChangedメソッドを実行するためのサンプルです。
class OverrideSample : NotifyPropertyChanged {
protected override void OnPropertyChanged(string propertyName) {
if (propertyName == "") return;
base.OnPropertyChanged(propertyName);
}
}
これによってOverrideSampleオブジェクトでOnPropertyChangeメソッドを実行すると上記の処理が実行されます。

