新規プロパティの実装
引き続き、前回のコードを改良していきましょう。
前回のコードでは影の色と深さを直接書いていました。これを、前景色などと同じように、プロパティで変更できるようにしたいですね。そこでまずは色と深さを保持するための変数を用意します。クラスの行頭に次のコードを追加してください。
1 2 |
private Color _shadowColor = SystemColors.GrayText; private int _shadowDepth = 1; |
1 2 |
Private _shadowColor As Color = SystemColors.GrayText Private _shadowDepth As Integer = 1 |
それぞれの変数にはデフォルト値を設定します。そして、OnPaintの影を描画している部分を次のように、変数を使用するように変更します。
1 2 3 4 5 6 |
Brush brush = new SolidBrush(_shadowColor); for (int i = 1; i <= _shadowDepth; i++) { pe.Graphics.DrawString(Text, Font, brush, i, i); } brush.Dispose(); |
1 2 3 4 5 |
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() |
これで下準備はできました。いよいよプロパティのコードです。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 |
public Color ShadowColor { get { return _shadowColor; } set { _shadowColor = value; Invalidate(); } } public int ShadowDepth { get { return _shadowDepth; } set { _shadowDepth = value; Invalidate(); } } |
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 |
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が呼ばれています。そのような追加の処理が必要なく、次のような単純なプロパティを作りたいとします。
1 2 3 4 5 6 7 8 9 10 11 12 13 |
private int _someValue = 1; public int SomeValue { get { return _someValue; } set { _someValue = value; } } |
1 2 3 4 5 6 7 8 9 10 |
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 |
この場合、次のように省略した形でコードを書くことができます。
1 2 3 4 5 |
public int SomeValue { get; set; } public SomeClass() { SomeValue = 1; } |
1 |
Public Property SomeValue As Integer = 1 |
C#の場合、初期値はコンストラクタで設定します。これは、プロパティの自動実装と呼ばれています。
次に、読み取り専用のプロパティの書き方を説明します。実はとても簡単です。
1 2 3 4 5 6 7 8 9 |
public int X { get; set; } public int Y { get; set; } public int Sum { get { return X + Y; } } |
1 2 3 4 5 6 7 |
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日