プロパティを通さなければアクセスできない変数を設定したい(VB2005)

このQ&Aのポイント
  • プロパティを通さなければアクセスできない変数を設定する方法について説明します。
  • メンバ変数とプロパティのコードを示し、同じクラス内でメンバ変数へ直接アクセスする場合と、プロパティを通してアクセスする場合の違いについて説明します。
  • 変数_hogeへのアクセスをプロパティを通して制限する方法について説明します。
回答を見る
  • ベストアンサー

プロパティを通さなければアクセスできない変数を設定したい(VB2005)

下記はメンバ変数とプロパティのコードです。 -------------------------------------- 'メンバ変数 Private _hoge As Integer = 1 'プロパティ Private ReadOnly Property phoge()   Get     Return _hoge   End Get End Property -------------------------------------- 上記の構造だと、同じクラス内であれば、下記のようにメンバ変数へプロパティを通さずアクセスが可能です。 Private Sub aaa()   MessageBox.Show(_hoge)   ' 1 と表示される(ここでエラーを出したい) End Sub 質問内容は、変数_hogeに対してアクセスするには、(同じクラス内からのアクセスであっても)プロパティを通さなければならない形にしたい、というものです。 つまり、下記のような形でないとエラーが発生するようにしたいと考えています。 Private Sub aaa()   Dim foo As Integer = phoge()   MessageBox.Show(foo) End Sub どうぞよろしくお願い致します。

  • tekan
  • お礼率80% (46/57)

質問者が選んだベストアンサー

  • ベストアンサー
  • redfox63
  • ベストアンサー率71% (1325/1856)
回答No.1

無理だと思いますよ Privateのスコープはクラス内で有効ですから同一クラス内からのアクセスを禁止できないです ReadOnlyプロパティなら即値を返すようにしてやれば _hogeを宣言する必要は無いように思います 別の方法なら そのクラスにPrivateクラスを作成してそのクラスを通してアクセスするようにするかでしょう たとえば public Class foo   Private Class bar     Private Shaerd _hoge as integer = 1     Shared readonly property phoge() as integer       return _hoge     end Property   End Class End Class といった具合です これなら fooクラスからは barクラスが使えますが他からは使えません fooクラスからでも直接_hogeへアクセスも出来ません

tekan
質問者

お礼

redfox63さん やはり無理ですか。。 同一クラス内のメンバ変数を利用する際、プロパティ経由か直接アクセスするかで迷っています。 質問内容の方法が実現できれば、全てプロパティ経由にしようと思ったのですが。。 クラス内にクラスを作成する件、検討させていただきます。 ご回答ありがとうございました。

関連するQ&A

  • プロパティについて

    長年他の言語をやってきまして、VB.NETでピンと来ていない点があります。どなたかご教授ください。 あるクラスのプロパティとセッターゲッターについて2通りの 書き方ができると思っています。 以下の1、2の違いはありますでしょうか?入門書やネット上を検索 すると1の例で記述されますが、経験上2のような書き方をしてしまうため気になっております。 1. Private _hoge As Integer = 0 Public Property Hoge() As Integer  Get   Return _hoge  End Get  Set(ByVal Value)   _hoge = Value  End Set End Property 2. Private _hoge As Integer = 0 Public Function getHoge() As Integer  Return _hoge End Function Public Sub setHoge(ByVal val As Integr)  _hoge = val End Sub

  • 自作したメソッド・・・引数はなるべく省略すべき?(VB2005)

    自作したメソッドに関して、引数はなるべく設定するべきでしょうか?それとも、引数は省略できるなら省略したほうがよいでしょうか? 下記(a)、(b)は例です。 a)引数はなるべく省略   ---------------------------------   Private Sub hoge()     Call foo()   End Sub   Private Sub foo()     Dim hoga As integer = Pbar    'プロパティ「Pbar」の値を設定     '処理   End Sub   --------------------------------- b)あえて引数を設定   ---------------------------------   Private Sub hoge()     Dim hoga As integer = Pbar    'プロパティ「Pbar」の値を設定     Call foo(hoga)   End Sub   Private Sub foo(ByVal hoga As integer)     '処理   End Sub   --------------------------------- 現在、(b)のようにあえて引数を設定したほうが、呼び出し先のメソッドがどういう処理を行っているかを掴めていいかな?と考え始めています。 ご助言よろしくお願い致します。

  • 自作したメソッド・・・こんな場合、引数は省略すべき?(VB2005)

    #注)この質問は下記のリンク先の質問の続きとなります。 #未読の方はリンク先をお読みくださいませ。 # #自作したメソッド・・・引数はなるべく省略すべき?(VB2005) #http://oshiete1.goo.ne.jp/qa3409289.html 仮に、フォームにボタンが複数個あり(Name = btnA,btnB,btnC…)、いずれかのボタンをクリックすると、共通処理のモジュール「shori」を呼び出すプログラムを想定します。   コード   ------------------------------------------------   Private Sub btnA_Click()     Dim hoge As integer = Phoge 'a)プロパティの値を設定     Dim foo As integer = Pfoo  'b)     Dim bar As integer = Pbar  'c)     Call syori(hoge,foo,bar)   End Sub      Private Sub btnB_Click()     Dim hoge As integer = Phoge 'a)プロパティの値を設定     Dim foo As integer = Pfoo  'b)     Dim bar As integer = Pbar  'c)     Call syori(hoge,foo,bar)   End Sub    :    :      Private Sub shori()    'ボタンクリックイベントの共通処理     'd) 処理   End Sub   ------------------------------------------------ 引数を省略しない形だと、(a)~(c)のコードを、全てのボタンのClickイベントに書き込むことになり、コードが煩雑になります。こういった場合、引数を省略する形、つまり(a)~(c)のコードを(d)の箇所へ書き込む手法は積極的に行うべきでしょうか?(Call文の形は、syori() となる) ご助言よろしくお願い致します。

  • プロパティのアクセス修飾子

    オート・インプリメント・プロパティで、 Property Prop2 As String = "Empty" と書いた場合の、Propertyのアクセス修飾子はPublicになるのでしょうか? あるVBの記述で、 Private CurrentValue As Integer Private Property Current As Integer Get Return CurrentValue End Get Set(ByVal value As Integer) CurrentValue = value    その他諸々の記述   End Set End Property というのがあるのですが、外部から、 Current += 1 などのようにアクセスしています。 この場合、Property Current As Integer のアクセス修飾子がPrivateになっているのですが、 Public とした場合と何が違うのでしょうか? ちなみに両方でやってみましたが、動作は変わりませんでした。 御経験のある方、御教示願えたらと思います。

  • VB2008: 独自例外とは?

    独自例外の確認ための質問をします。 独自例外の発生をキャッチして表示する術がわからなくて苦肉の策でエラートラップを利用。 しかし、こういう事であれば何も独自例外を設定する必要がありません。 と思ったり、「スルーだからテストに<0除算>を選んだのが悪いのか?」と考えたり。 ともかく、判っているのか判っていないのかが判らない状態に陥っています。 そういうことで、独自例外について少し教えて頂ければ幸いです。 ' ============================== ' クラスプログラミング; 演習2 ' ============================== Module theClass   Sub Main()     On Error GoTo Error_Main     Dim T1 As New TEST1     Debug.Print(T1.MembersLengthAverage.ToString) Exit_Main:     Exit Sub Error_Main:     ErrorMsg(Err.Description & "(Main)")     Resume Exit_Main   End Sub End Module ' ================================================================== ' クラス TEST1 ' ================================================================== <Serializable()> Public Class TEST1   Private _MemberCount As Integer   Private _Member1 As String   Private _Member2 As String    ReadOnly Property MembersLengthAverage() As Integer     Get       If _MemberCount <> 0 Then         Return (_Member1.Length + _Member2.Length) \ _MemberCount       Else         Throw New System.Exception("TEST1: 除算エラーが発生しました。" )       End If     End Get   End Property   Public Sub New()     _Member1 = ""     _Member2 = ""   End Sub End Class

  • プロシジャを変数名で呼び出す方法は?

    確か、以前にこの方法を何処かで発見した記憶があるのですが、Googleで検索しても見付からないので質問とさせていただきます。 --------------------- Sub t() Call ("test" & 1) End Sub ----- Sub test1() MessageBox.Show("1が選択されました") End Sub ----- Sub test2() MessageBox.Show("2が選択されました") End Sub --------------------- 上記はエラーが出ます(「式はメソッドではありません」エラー) このように、プロシージャー名の一部や全部を変数にしてCallする方法は存在していなかったでしょうか? 何処でというのも忘れてしまいましたし、Visual Basic 2010ではなく、ExcelかAccessのVBAだったと思うのですが、このCallの部分を変数にして、動的に呼び出すプロシージャーを変更する事ができた記憶があるのですが… 御存知の方、いらっしゃいましたら、よろしくお願いします。

  • VB2005の構造体で配列を含む構造体へアクセスするプロパティの記述方法

    VB2005の構造体で、以下のように Dantaiという配列を含む構造体があり、 プロパティを記述する方法で困っています。 Structure Person Dim namae As String Dim toshi As Integer end Structure Structure Dantai Dim m_DantaiMei As String Dim m_Hito() As Person Public Sub New(mei As String) m_DantaiMe = mei Redim m_Hito(100) End Sub '団体名 Public Property Dantai_Mei() As String Get Return m_DantaiMei End Get Set(ByVal value As String) m_DantaiMei = value End Set End Property '人 Public Property ???  '???????????? どのようにプロパティを設定したらよいのでしょうか? '???? '???? 配列で、しかも構造体です。 '???? '???? End Property End Structure Dim dantai As New Dantai("A") MessageBox(dantai.Dantai_Mei) MessageBox(人100人を表示させたい) '?????????????????????????? あと、構造体のDimはデフォルトで、PublicでしょうかPrivateでしょうか? VB2005の構造体について、VB6との違い、クラスとの違いなど詳しく書かれている サイトなどご存じの方教えて下さい。

  • プロパティープロシージャーについて

    簡単な年齢計算プログラムです。 書籍のサンプルなのでうまく動いています。 クラスの変数がPrivate strnameだったりするので そこへアクセスするためにプロパティプロシージャーを使っているというところまでは 判ったような気がしますが、 getとsetの関係がわかりません。 まず、 1.何をGetしているのか 2.なぜGetが先に来るのか、 3.Setの前にGetのReturnで返してますが実態は何を返しているのでしょうか?普通に考えると逆のような気がします。 根本がわかっていないのだと思いますが、どなたかお教え願います。 呼ぶ方 Public Class Form1 Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click Dim person As New Class1() person.Name = TextBox1.Text person.Birthday = DateTimePicker1.Value.Date MessageBox.Show(person.Name & "さんの年齢は" & person.GetAge()) End Sub クラスの方。 Public Class Class1 Private strname As String Private datBirthday As Date Public Property Name() As String Get Return strname End Get Set(ByVal pro_name As String) strname = pro_name End Set End Property Public Property Birthday() As Date Get Return datBirthday End Get Set(ByVal pro_birthday As Date) datBirthday = pro_birthday End Set End Property Public Function GetAge() As Integer Return Int(DateTime.Today.Subtract(Birthday).Days / 365.25) End Function End Class

  • ArrayListの初期値の設定の仕方(VB.NET)

    VB.NET2005についての質問です。 ArrayList型の変数の初期値に、プロパティの戻り値を設定することは可能でしょうか。 (つまり、下記の(a)(b)の二行を一行にまとめたい、と考えています) どうぞよろしくお願い致します。 Public Class form1   Dim hoge As New ArrayList  'a)初期値としてClass1.P_hogeを設定したい   hoge = Class1.P_hoge    'b)消したい End Class Public Class Class1   Private Shared _hoge As New ArrayList  'すでに値が格納されているものとする   Public Shared Property P_hoge() As ArrayList      Get    Return _hoge    End Get   End Property End Class

  • Option Strictと構造体とArrayListの関係について(VB2005)

    下記はArrayListに構造体の値を格納し、表示させるプログラムです。 -------------------------------- Option Strict Off '構造体 Public Structure hoge   Dim a As String   Dim b As String   Dim c As String End Structure Private Sub test()   Dim aryhoge As New ArrayList   Dim foo As hoge   foo.a = "aa"   foo.b = "bb"   foo.c = "cc"   aryhoge.Add(foo)           MessageBox.Show(aryhoge(0).a)  'A) Option Strict Off だと"aa"と表示される End Sub -------------------------------- このプログラムはOption Strict Offだとメッセージボックスに"aa"と表示されます。 ですがOption Strict Onだと、(A)の箇所にて「遅延バインディングを使用できません」というエラーが発生し、実行ができません。 質問内容は、Option Strict Onで上記のプログラムを動かすには、(A)をどのように修正すればよいか、というものです。 どうぞよろしくお願い致します。

専門家に質問してみよう