プロが教える店舗&オフィスのセキュリティ対策術

クラスの勉強中です。
http://excelwork.info/excel/classpropertylet/
上記URLの記述において、

Private p_Name As String
Private p_Age As Long

'Property Let ステートメント
Public Property Let Name(str As String)
p_Name = str
End Property

確認のために、Nameがプロパティの名前で、strはただの変数、ですよね?
p_Nameこれは何ですか?strを経由してここに代入される値が実際のプロパティの値になるようですが「p_NameがNameプロパティの実際の値を示す」と、どうやって分かるのですか?単に代入文の左辺にあるから?1個のLetステートメントには1個の変数しか左辺に置けないルールになってるのでしょうか?また、なんでName=strと表現しないのですか?ややこしいだけに見えます。

A 回答 (1件)

> p_Nameこれは何ですか?


> なんでName=strと表現しないのですか?

それは、クラスの内部変数(ご質問でのp_Name)が、必ずしもプロパティを介してクラス外部とやり取りする値(ご質問でのstr)と一致しないからです。

内部変数に代入する前に、Letプロパティで与えられた値が適切なものかチェックし、適切でないならデフォルト値を代入するような処理をしたりすることもあります。

また、普通はプロパティの名前や値はクラスを使用する人が、それがどの様なものか想像しやすい名前や形式をとるようにします。
でも内部変数はクラスの設計者が扱い易い形式で保存させます。その為の変換処理を行うのがPropertyで記述される処理です。


> 単に代入文の左辺にあるから?1個のLetステートメントには1個の変数しか左辺に置けないルールになってるのでしょうか?

例えば、プロパティ名は姓名であっても、クラス設計者がクラス内部では姓と名を分けて保持したければその様にすれば良いし、一つで管理したければそう管理すれば良いのです。



以下、クラス内部では西暦で保持していますが、Heiseiプロパティを使用すれば、平成の年号でやりとりができます。
-----------------------
Sub sample()
  Dim a As Object
  Set a = New Nengou
  
  MsgBox a.Heisei ' 28と表示
  
  a.Seireki = 2020
  MsgBox a.Heisei ' 32と表示
End Sub


----Nenngou-----
Private p_year As Long

Private Sub Class_Initialize()
  p_year = Year(Now)
End Sub

Property Let Seireki(y As Long)
  If y >= 1 Then
    p_year = y
  Else
    p_year = 1
  End If
End Property

Property Get Seireki() As Long
  Seireki = p_year
End Property

Property Let Heisei(y As Long)
  If y >= 1 Then
    p_year = y + 1988
  Else
    p_year = 1
  End If
End Property

Property Get Heisei() As Long
  Heisei = p_year - 1988
End Property

-----
    • good
    • 0
この回答へのお礼

ありがとうございます。
プロパティ名、内部変数、外部とやり取りする変数の違いが理解出来てませんでした。クラスで実際に扱うのは内部変数で、使う側から見えるclass.Nameはあくまでプロパティ名だったのですね。

お礼日時:2016/09/06 07:23

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!