none
プロパティとメゾットの違いについて RRS feed

  • 質問

  •  プロパティとメゾットの違いを勘違いして自作のクラスを作っていた事に気が付いたのが一昨日なのですが、そこで質問があります。

        Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click

            Dim sample As New BMI

            sample.Shintyou = CDbl(Me.TextBox1.Text)
            sample.Taijyuu = CDbl(Me.TextBox2.Text)

            Me.Label1.Text = sample.BMI1
            Me.Label2.Text = sample.BMI2

        End Sub

        Class BMI
            Private _Shintyou As Double
            Private _Taijyuu As Double

            Public Sub New()
                _Shintyou = 0
                _Taijyuu = 0
            End Sub

            Public Property Shintyou() As Double
                Get
                    Return _Shintyou
                End Get
                Set(ByVal value As Double)
                    _Shintyou = value
                End Set
            End Property

            Public Property Taijyuu() As Double
                Get
                    Return _Taijyuu
                End Get
                Set(ByVal value As Double)
                    _Taijyuu = value
                End Set
            End Property

            Public ReadOnly Property BMI1() As Double
                Get
                    Return _Taijyuu - _Shintyou ^ 2
                End Get
            End Property

            Public Function BMI2() As Double
                Return _Taijyuu - _Shintyou ^ 2
            End Function

        End Class

     例えば、こんなクラス(とフォーム)を作ってしまったとします。BMI1とBMI2の戻り値は同じになります。今まではBMI1の方のやり方で作っていたのですが、たまたま引数が必要な戻り値が必要になり、調べている内にBMI2のやり方が本来のやり方の様な気がしてきました。

     メゾットというと何らかの動作を伴うものと思っていたので、関数のような使い方をクラスでやる場合はReadOnly Propertyでやるのかな、と勘違いしていた(と思う)わけです。

     が、引数がない場合はどっちも同じ気がするのですが、ReadOnly Propertyにする方法と、Functionにする方法はどちらが正しいのでしょうか?

    2006年10月9日 17:51

回答

  • 通常は「メソッド」と記述すると思います。

    で、プロパティとメソッドのどちらを使うかですが、どちらが正しいという話ではなく、クラスを設計する人がどのように使ってほしいかによって適切に選択するものだと思います。
    自分だったら、Personというクラスを作り、そのインスタンスに身長、体重は必ず設定するという状態であれば、BMIというプロパティを用意してそこから値を取り出せるようにするでしょうね。
    それとは別に、BMIUtilityというようなクラスを作ってBMIの計算式をそこに格納しておきたいのであれば、そのときは静的メソッドとしてBMICalculateというメソッドを定義して身長、体重を引数として取るようにするかもしれません。
    このあたりはどういったクラスを設計していくかによってどちらを使うべきか変わってくるものだと思います。

     

    2006年10月9日 19:10

すべての返信

  • 通常は「メソッド」と記述すると思います。

    で、プロパティとメソッドのどちらを使うかですが、どちらが正しいという話ではなく、クラスを設計する人がどのように使ってほしいかによって適切に選択するものだと思います。
    自分だったら、Personというクラスを作り、そのインスタンスに身長、体重は必ず設定するという状態であれば、BMIというプロパティを用意してそこから値を取り出せるようにするでしょうね。
    それとは別に、BMIUtilityというようなクラスを作ってBMIの計算式をそこに格納しておきたいのであれば、そのときは静的メソッドとしてBMICalculateというメソッドを定義して身長、体重を引数として取るようにするかもしれません。
    このあたりはどういったクラスを設計していくかによってどちらを使うべきか変わってくるものだと思います。

     

    2006年10月9日 19:10
  •  すいません、自己レスで申し訳ないのですが、

       http://homepage1.nifty.com/rucio/main/dotnet/shokyu/standard47.htm

     ここに考え方が載っていました。要は、プロパティでもメゾットでもどっちでも出来る、らしいですね。

     まだきちんと読み切っていませんが、プロパティは状態を、メゾットは動作を表す感じっぽいことが判りました。

     だとすると、先の件はプロパティにするのがすんなり解釈できそうなので、プロパティのままで良さそうな気がしてきました。

    2006年10月9日 19:20
  •  どっとねっとふぁんさん、こんばんわ。自己レスを書いて投稿した後に返信をいただいていたことに気が付きました。

    >通常は「メソッド」と記述すると思います。

     すいません、言葉自体も勘違いしていたようです (^-^;)

    >このあたりはどういったクラスを設計していくかによってどちらを使うべきか変わってくるものだと思います。

     どうやらそのようです。お騒がせして申し訳ありませんでした。

     VBAの頃はクラスなんて作らなかったので、またまだ覚えなければならないことが多いですが、これからもよろしくお願いします。

    2006年10月9日 19:28