- 題名: 親の親 祖父クラスに変更を加えたい場合。
- 日時: 2011/10/19 13:10:09
- ID: 29256
- この記事の返信元:
- (なし)
- この記事への返信:
- [29257] Re[1]: 親の親 祖父クラスに変更を加えたい場合。2011/10/19 13:51:14
- [29260] Re[1]: 親の親 祖父クラスに変更を加えたい場合。2011/10/19 14:05:18
- ツリーを表示
■No29256に返信(ろいかえさんの記事) Public Interface IDataGridViewColumnEx Property NewProperty As String End Interface Public Class DataGridViewTextBoxColumnEX Inherits DataGridViewTextBoxColumn Implements IDataGridViewColumnEx Public Property NewProperty As String Implements IDataGridViewColumnEx.NewProperty Get End Get Set(value As String) End Set End Property End Class Public Class DataGridViewLinkColumnEx Inherits DataGridViewLinkColumn Implements IDataGridViewColumnEx Public Property NewProperty As String Implements IDataGridViewColumnEx.NewProperty Get End Get Set(value As String) End Set End Property End Class 多重継承はインターフェースで実装です。
■No29266に返信(ろいかえさんの記事) > なんとかして定義も共有する方法はないのでしょうか… ちょっと強引ですがExtensionを使用して 呼び出し: Column1.NewValue.Value = "1" Column2.NewValue.Value = "2" Dim a = Column1.NewValue.Value Dim b = Column2.NewValue.Value 定義: Imports System.Runtime.CompilerServices Public Module DataGridViewColumnExMod Private m_NewValues As Dictionary(Of DataGridViewColumn, clsNewValue) = Nothing <Extension()> Public Function NewValue(gcol As DataGridViewColumn) As clsNewValue Dim Ret As clsNewValue = Nothing If gcol Is Nothing Then Return New clsNewValue() End If If m_NewValues Is Nothing Then m_NewValues = New Dictionary(Of DataGridViewColumn, clsNewValue) Else m_NewValues.TryGetValue(gcol, Ret) End If If Ret Is Nothing Then Ret = New clsNewValue m_NewValues.Add(gcol, Ret) AddHandler gcol.Disposed, AddressOf gcol_disposed End If Return Ret End Function Private Sub gcol_disposed(sender As Object, e As EventArgs) m_NewValues.Remove(DirectCast(sender, DataGridViewColumn)) If m_NewValues.Count = 0 Then m_NewValues = Nothing End If End Sub End Module Public Class clsNewValue Public Property Value As String = String.Empty End Class
■No29270に返信(Azuleanさんの記事) ■No29271に返信(shuさんの記事) デリゲート、拡張メソッド、どちらも知らない機能だったのでとても勉強になりました。 しかし今回一番参考になったのは、 Public Property Value As String = String.Empty の1行でプロパティの定義ができるということです。 プロパティの中身を書かなくても、自動的に Private _NewProperty As String Public Property NewProperty() As String Get Return _NewProperty End Get Set(ByVal value As String) _NewProperty = value End Set End Property のような処理をしてくれるということを今まで知りませんでした。 これならばプロパティの内部処理を間違って書くことがないので、 単純な取得と設定だけのプロパティは以下のように1行で書くことに致します。 Public Interface IDataGridViewColumnEx Property NewProperty As String End Interface Public Class DataGridViewTextBoxColumnEx Inherits DataGridViewTextBoxColumn Implements IDataGridViewColumnEx Public Property NewProperty As String = String.Empty Implements IDataGridViewColumnEx.NewProperty End Class Public Class DataGridViewLinkColumnEx Inherits DataGridViewLinkColumn Implements IDataGridViewColumnEx Public Property NewProperty As String = String.Empty Implements IDataGridViewColumnEx.NewProperty End Class 問題はプロパティ内で別のメソッドや変数にアクセスするような場合は1行で書けないので、 Azuleanさんやshuさんに提示していただいた方法を使うことになります。 拡張メソッドについては、調べて大体把握したのですが、 (この場合は拡張メソッドで値保持用クラスのインスタンスを取得して、値保持用クラスのプロパティにアクセスする方法ですね) デリゲートについては、プロパティが委譲できないらしいので、どこをデリゲートして良いのかわかりません; (いろんな構造を考えたのですが、どうしてもNewPropertyを共有化させる方法が思いつきません)
分類:[.NET]