新規プロパティの実装
引き続き、前回のコードを改良していきましょう。
前回のコードでは影の色と深さを直接書いていました。これを、前景色などと同じように、プロパティで変更できるようにしたいですね。そこでまずは色と深さを保持するための変数を用意します。クラスの行頭に次のコードを追加してください。
private Color _shadowColor = SystemColors.GrayText; private int _shadowDepth = 1;
Private _shadowColor As Color = SystemColors.GrayText Private _shadowDepth As Integer = 1
それぞれの変数にはデフォルト値を設定します。そして、OnPaintの影を描画している部分を次のように、変数を使用するように変更します。
Brush brush = new SolidBrush(_shadowColor); for (int i = 1; i <= _shadowDepth; i++) { pe.Graphics.DrawString(Text, Font, brush, i, i); } brush.Dispose();
Dim brush As Brush = New SolidBrush(_shadowColor) For i As Integer = 1 To _shadowDepth e.Graphics.DrawString(Text, Font, brush, i, i) Next brush.Dispose()
これで下準備はできました。いよいよプロパティのコードです。
public Color ShadowColor { get { return _shadowColor; } set { _shadowColor = value; Invalidate(); } } public int ShadowDepth { get { return _shadowDepth; } set { _shadowDepth = value; Invalidate(); } }
Public Property ShadowColor() As Color Get Return _shadowColor End Get Set(value As Color) _shadowColor = value Invalidate() End Set End Property Public Property ShadowDepth() As Integer Get Return _shadowDepth End Get Set(value As Integer) _shadowDepth = value Invalidate() End Set End Property
見慣れない構文が出てきたと思います。C#ではメソッドと区別するためにプロパティ名のあとに()が付きません。VB.NETではPropertyキーワードが付いています。getとsetはアクセサと呼ばれ、getはプロパティの値を取得する時に呼び出され、setは値を設定する時に呼び出されます。また、valueという特別な変数が使われています。この変数には、プロパティウィンドウやアプリケーションのコードなどで設定した値が入っています。
では、F6キーでコンパイルしてみましょう。プロパティウィンドウにShadowColorとShadowDepthが追加されましたね。それぞれの値を変更してみましょう。ちゃんと反映されましたね。このように、プロパティはその特殊な構文を覚えてしまえば、簡単に実装することができます。
せっかくなので、プロパティの書き方をもう少し掘り下げてみましょう。上のコードの場合、setでInvalidateが呼ばれています。そのような追加の処理が必要なく、次のような単純なプロパティを作りたいとします。
private int _someValue = 1; public int SomeValue { get { return _someValue; } set { _someValue = value; } }
Private _someValue As Integer = 1 Public Property SomeValue() As Integer Get Return _someValue End Get Set(value As Integer) _someValue = value End Set End Property
この場合、次のように省略した形でコードを書くことができます。
public int SomeValue { get; set; } public SomeClass() { SomeValue = 1; }
Public Property SomeValue As Integer = 1
C#の場合、初期値はコンストラクタで設定します。これは、プロパティの自動実装と呼ばれています。
次に、読み取り専用のプロパティの書き方を説明します。実はとても簡単です。
public int X { get; set; } public int Y { get; set; } public int Sum { get { return X + Y; } }
Public Property X() As Integer Public Property Y() As Integer Public ReadOnly Property Sum() As Integer Get Return X + Y End Get End Property
C#の場合は単にgetアクセサを書くだけです。VB.NETの場合はReadOnlyキーワードを付けます。書き込み専用のプロパティも作れます。C#の場合は単にsetアクセサを書くだけ、VB.NETの場合はWriteOnlyキーワードを付けます。
2014年1月2日