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

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

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

Re[3]: 各クラス間のインスタンス情報保持の定石


(過去ログ 81 を表示中)

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

■48019 / inTopicNo.1)  各クラス間のインスタンス情報保持の定石
  
□投稿者/ えれこぜ (3回)-(2010/03/20(Sat) 17:31:21)

分類:[.NET 全般] 

趣味でVB2005を使用しています。

FormAにPictureBoxを貼り、文字列を描画させたいと考えています。
但し、文字列を作成するのは別クラスDが担当しています。

FormA(画面)→ClassB(碁盤)→ClassC(マス)→ClassD(駒)

隣り合ったクラスのインスタンスしか保持していないため、
ClassDからFormAの文字描画メソッドを呼びだすことはできません。
現状は、DからC、CからB、BからAと文字列をイベントでバケツリレーしています。
しかし、各クラスで同様の記述をしていることから、非常に無駄なことをしているように思われます。

いきなりDからAのメソッドを呼びだしたいのですが、可能でしょうか?
(BからAは操作できますが、CやDからもAを直接操作したいのです)

不可能であれば、今のバケツリレー方式と、
全てのクラスでFormAのインスタンスを保持するのと、
どちらが良い方法と言えるでしょうか?
引用返信 編集キー/
■48025 / inTopicNo.2)  Re[1]: 各クラス間のインスタンス情報保持の定石
□投稿者/ よねKEN (446回)-(2010/03/20(Sat) 22:24:53)
> 隣り合ったクラスのインスタンスしか保持していないため、
> ClassDからFormAの文字描画メソッドを呼びだすことはできません。

FormAがClassB→ClassC→ClassDと辿ってClassDの文字列作成メソッドを呼び出して
戻り値として、文字列を取得し、FormAがそれを描画してはどうでしょう。

あるいは、ClassB〜ClassDがそれぞれの描画を担当する手もあるかと思います。
・FormAはGraphicsオブジェクトの準備とClassBの描画の呼び出し
・ClassBは碁盤の描画を担当(マス以外の部分の描画とClassCの描画処理の呼び出し)
・ClassCは個々のマスの描画を担当(マスの部分の描画とClassDの描画処理の呼び出し)
・ClassDの駒の描画を担当

描画するにはGraphicsオブジェクトがあればよいので、それぞれの描画メソッドのパラメータにGraphicsを用意し、
FormAで用意したGraphicsオブジェクトを渡せばよいでしょう。

引用返信 編集キー/
■48071 / inTopicNo.3)  Re[2]: 各クラス間のインスタンス情報保持の定石
□投稿者/ えれこぜ (4回)-(2010/03/23(Tue) 16:50:43)
2010/03/23(Tue) 17:00:36 編集(投稿者)
2010/03/23(Tue) 16:59:47 編集(投稿者)

<pre><pre>■No48025 (よねKEN さん) に返信
よねKENさん、お答頂きありがとうございます。

> FormAがClassB→ClassC→ClassDと辿ってClassDの文字列作成メソッドを呼び出して
> 戻り値として、文字列を取得し、FormAがそれを描画してはどうでしょう。

2つ答えを用意して頂きましたが、こちらより、

> あるいは、ClassB〜ClassDがそれぞれの描画を担当する手もあるかと思います。
> ・FormAはGraphicsオブジェクトの準備とClassBの描画の呼び出し
> ・ClassBは碁盤の描画を担当(マス以外の部分の描画とClassCの描画処理の呼び出し)
> ・ClassCは個々のマスの描画を担当(マスの部分の描画とClassDの描画処理の呼び出し)
> ・ClassDの駒の描画を担当
> 描画するにはGraphicsオブジェクトがあればよいので、それぞれの描画メソッドのパラメータにGraphicsを用意し、
> FormAで用意したGraphicsオブジェクトを渡せばよいでしょう。

恐らくこちらが正解な気がしました。
B、C、Dが何をしているか、FormAは頓着しないでいられると思いましたので。

画像処理であるGraphicsオブジェクトを各クラスで利用するのは、何かコストがかかると思い込んでいましたが、
参照型であるため、ひとつの物を色々な角度から見ているにすぎないのですよね?
解決しましたので、少し長いですがソースを載せて締めます。

Public Class Form1
    Private board As New ClassB
    Private Sub PictureBox1_Paint(ByVal sender As Object, ByVal e As System.Windows.Forms.PaintEventArgs) Handles PictureBox1.Paint
        'Graphicsオブジェクトの準備とClassBの描画の呼び出し
        board.Paint(e.Graphics)
    End Sub
    Private Sub Timer1_Tick(ByVal sender As Object, ByVal e As System.EventArgs) Handles Timer1.Tick
        PictureBox1.Invalidate() '便宜上タイマーで
    End Sub
End Class

Public Class ClassB
    Private sizeX As Integer = 9
    Private sizeY As Integer = 9
    Private grid(sizeX, sizeY) As ClassC
    Sub New()
        Dim syurui As Integer = 0
        For y As Integer = 0 To sizeY - 1
            For x As Integer = 0 To sizeX - 1
                grid(x, y) = New ClassC(x, y, syurui)
                syurui += 1
            Next
        Next
    End Sub
    Public Sub Paint(ByVal g As Graphics)
        'マス以外の部分(碁盤)の描画とClassCの描画処理の呼び出し
        g.FillRectangle(Brushes.Black, New Rectangle(0, 0, 100, 100))
        For y As Integer = 0 To sizeY - 1
            For x As Integer = 0 To sizeX - 1
                grid(x, y).Paint(g)
            Next
        Next
    End Sub
End Class

Public Class ClassC
    Private koma As New ClassD
    Public X As Integer 'X座標位置
    Public Y As Integer 'Y座標位置
    Public Syurui As Integer 'こまの種類
    Sub New(ByVal x As Integer, ByVal y As Integer, ByVal syurui As Integer)
        Me.X = x * 10 + 5
        Me.Y = y * 10 + 5
        Me.Syurui = syurui
    End Sub
    Public Sub Paint(ByVal g As Graphics)
        'マスの部分の描画とClassDの描画処理の呼び出し
        g.FillRectangle(Brushes.Khaki, New Rectangle(X, Y, 9, 9))
        koma.Paint(g, Me)
    End Sub
End Class

Public Class ClassD
    Dim number As Integer = 0
    Dim font As New Font(FontFamily.GenericSerif, 5)
    Public Sub Paint(ByVal g As Graphics, ByVal classC As ClassC)
        '駒の描画を担当
        g.DrawString(classC.Syurui.ToString, font, Brushes.Black, classC.X, classC.Y)
        classC.Syurui += 1
        If classC.Syurui > 100 Then classC.Syurui = 0
    End Sub
End Class

解決済み
引用返信 編集キー/
■48073 / inTopicNo.4)  Re[3]: 各クラス間のインスタンス情報保持の定石
□投稿者/ みきぬ (837回)-(2010/03/23(Tue) 17:19:22)
※質問とは関係ないです。

> FormA(画面)→ClassB(碁盤)→ClassC(マス)→ClassD(駒)

「碁盤」ということは、囲碁のお話かしら?
いや、囲碁の石ってマス目じゃなくて、交点のところに置くんじゃないっけ? と思っただけなんだけども。
解決済み
引用返信 編集キー/


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

このトピックに書きこむ

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

管理者用

- Child Tree -