0

プロパティを相互に同期させるために、クラス内に多くのコードを記述していることに気付きました。クラスのイベントについて読んだことがありますが、探しているものに対してそれらを機能させる方法について頭を悩ませることができませんでした。ここでいくつかのアドバイスを使用できます。

たとえば、この例では、 、またはプロパティmyColorのいずれかまたはすべての変更を常に最新の状態に保ちたいと考えています。RedGreenBlue

Class myColors
    Private Property Red As Byte
    Private Property Green As Byte
    Private Property Blue As Byte
    Private Property myColor As Color
    Sub New()
        myColor = Color.FromArgb(0, 0, 0)
    End Sub
    Sub ChangeRed(ByVal r As Byte)
        Red = r
        myColor = Color.FromArgb(Red, Green, Blue)
    End Sub
    Sub ChangeBlue(ByVal b As Byte)
        Blue = b
        myColor = Color.FromArgb(Red, Green, Blue)
    End Sub
End Class

これらの変更の 1 つ以上があれば、myColor更新したいと思います。myColor = Color.FromArgb(Red, Green, Blue)上記のように簡単ですが、すべてのサブルーチンを入れる必要がないように、これを自動的に行うイベントを操作する方法はありますか?

4

3 に答える 3

4

このシナリオでは、myColor プロパティを次のように変更しないのはなぜですか。

Private ReadOnly Property myColor As Color
  Begin Get
    Return Color.FromArgb(Red, Green, Blue)
  End Get
End Property

このようにして、常に同期されます。

于 2010-06-17T18:14:10.857 に答える
2

あなたの場合、イベントは役に立ちません。

イベントは、他の人のコードがあなたのコードに作用する方法として使用されます。コードが行っていることを世界に知らせるために、イベントを作成します。色が何らかの形で変更されるたびに発生させることができる色変更のイベントを作成できますが、これはあなたの利益のためではなく、クラスを使用し、何かをしたいときに何かをしたい他のコードによって単に使用されます。色が変更されます。

イベントは外部コード用であり、内部クラス管理用ではありません。私の前の人が言ったように、あなたが抱えている問題は、2 つの方法で解決できるカプセル化の問題です。

1)あなたがやっているように何かが変更されるたびに内部変数を更新します。しかし、あなたがやっているように色を再計算する ColorChanged() という内部プライベート関数を作成することをお勧めします。関数を作成すると言うのは、後で色が変更されたときにさらにロジックが必要になった場合に、3 つの場所で変更することを心配する必要がないからです。

2)要求されたときに色を更新します(私の前の人など)。アクセスされるたびに色を計算するプロパティを作成します。これは最も単純で、ほとんどの場合完璧に機能します。しかし、そのプロパティを大量に使用すると、これらすべての再計算がパフォーマンスの問題になる可能性があります (この場合、色の計算はそれほど集中的ではないため、問題になりません)。

この場合、小さなパフォーマンスの欠点にもかかわらず、単純化のためにオプション 2 を実行します...つまり、小さなパフォーマンスの欠点を意味します...

于 2010-06-17T18:20:30.293 に答える
2

Red、Green、および Blue のクラス変数を廃止し、すべての値を色オブジェクトに処理させるだけです。後で値を読み取りたい場合は、myColor.R、.G、または .B を呼び出して、必要なコンポーネントを取得できます。myColor オブジェクトには既に R、G、および B が格納されているため、情報を複製しても意味がありません。

于 2010-06-17T18:21:49.603 に答える