|
分類:[VB.NET/VB2005]
OS:XP 開発環境:VS2005
いつも拝見させて頂き非常に参考にさせていただいております。
ある基底クラスを作成し、さらに独自コレクションを作成致しました。 また、この基底クラスを継承し、基底クラスのメソッドをオーバーライドしたクラス(複数)を作成しました。 独自コレクションにクラス(複数)を追加後、ループさせながらオーバーライドしたメソッドを実行したいのですが、 必要な引数の数が違う場合が出てまいりました。 この場合、基底クラスに引数が一致した、オーバーライド可能なメソッドを追加する等行いましたが、 ループ内で引数の変更を行う必要が出てまいりました。 このような場合ループ内でクラスを判定し、個々のクラスの描画メソッドを呼び出すしか方法はないのでしょうか? Select分を使わない方法、もっとスマートに記述できる等、何か良い案が御座いましたらどなたかご教授下さい。
'基底クラス Public MustInherit Class Shape 〜定義〜 'オーバーライドするメソッド Public Overridable Sub Draw(Byval grfx as Graphics) End Sub 'オーバーライドするメソッド Public Overridable Sub Draw(Byval grfx as Graphics,Byval c as Color) End Sub End Class
'Shapeのコレクション Public Class ShapeCollection Implements ICollection 〜処理〜 End Class
'継承したクラス1 Public Class Line Inherits Shape 'オーバーライド Public Overrides Sub Draw(Byval grfx as Graphics) 〜描画処理〜 End Sub
End Class
'継承したクラス2 Public Class Polygon Inherits Shape 'オーバーライド Public Overrides Sub Draw(Byval grfx as Graphics,Byval c as Color) 〜描画処理〜 End Sub
End Class
'描画処理 Public drawData As ShapeCollection Private Sub PictureBox1_Paint(ByVal sender As Object, ByVal e As System.Windows.Forms.PaintEventArgs) Handles PictureBox1.Paint Dim grfx As Graphics = e.Graphics 'drawData.DrawDataコレクションにはLineクラスとPolygonクラス等が入っています。 For i As Integer = 0 To drawData.DrawData.Count - 1 Dim shape As Shape = DirectCast(drawData.DrawData(i), Shape) 'lineクラスのDrawしか呼べない… shape.Draw(grfx)
'このような感じにするしかないのでしょうか? 'Select Case drawData.DrawData(i).GetType.Name ' Case GetType(Line).Name ' Dim line As Line = DirectCast(drawData.DrawData(i), Line) ' line.Draw(grfx) ' Case GetType(Polygon).Name ' Dim Polygon As Polygon = DirectCast(drawData.DrawData(i), Polygon) ' Polygon.Draw(grfx, Color.Black) 'End Select
Next End Sub
|