C# と VB.NET の質問掲示板

ASP.NET、C++/CLI、Java 何でもどうぞ

C# と VB.NET の入門サイト

Re[2]: 基底クラスのオーバーライドにつきまして


(過去ログ 32 を表示中)

[トピック内 4 記事 (1 - 4 表示)]  << 0 >>

■15432 / inTopicNo.1)  基底クラスのオーバーライドにつきまして
  
□投稿者/ イナフ (9回)-(2008/03/12(Wed) 19:20:30)

分類:[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

引用返信 編集キー/
■15438 / inTopicNo.2)  Re[1]: 基底クラスのオーバーライドにつきまして
□投稿者/ Hongliang (256回)-(2008/03/12(Wed) 19:34:26)
引数じゃなくて各派生クラスのメンバに持たせればいいんじゃないですか?
引用返信 編集キー/
■15440 / inTopicNo.3)  Re[1]: 基底クラスのオーバーライドにつきまして
□投稿者/ よねKEN (133回)-(2008/03/12(Wed) 19:38:07)
2008/03/12(Wed) 19:38:56 編集(投稿者)
ShapeクラスにはSub Draw(Byval grfx as Graphics)の方のメソッドだけあればよいと思います。
PolygonクラスはこのDrawメソッドをオーバーライドします。
では、PolygonクラスのDrawをするときに使うカラーはどうするかというと、
Polygonクラスにカラー用のプロパティを用意しておきます。
コレクションのdrawDataにPolygonインスタンスを設定するタイミングなどで、
カラー用のプロパティに色を設定しておけばOKですね。
 

引用返信 編集キー/
■15444 / inTopicNo.4)  Re[2]: 基底クラスのオーバーライドにつきまして
□投稿者/ イナフ (10回)-(2008/03/12(Wed) 20:34:51)
Hongliang様、よねKEN様、ご返信ありがとう御座いました。

なるほどです…。
既にColorプロパティも宣言しておりながら、単純な事が理解できていませんでした。

お蔭様で解決致しました。
本当にありがとう御座いました。
解決済み
引用返信 編集キー/


トピック内ページ移動 / << 0 >>

このトピックに書きこむ

過去ログには書き込み不可

管理者用

- Child Tree -