• ベストアンサー

オブジェクトに値を保持させるにはプロパティに追加ですか?

オブジェクトに値を保持させるにはプロパティに追加ですか? 新たなプロパティを作成してそこに保持する方法でいいですか? ほかのやり方がありますか?

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

  • ベストアンサー
回答No.4

ううん・・・ 参照渡しの値渡しという言葉の意味が良く分かりません・・・ すいません。 内部クラスをプロパティに持つクラスを 値渡ししたい場合は、 その内部のクラスを自力でコピーしないとだめです。 所感で申し訳ございませんが、参照型、値型、参照渡し、値渡しがどういったものがきちんと掴めていないまま クラスのプロパティのやり取りを行おうとしているように感じます。 少し学習の順序が違うのではないでしょうか? 確かに販売されているVB.netの書籍には、分かりやすい本はいくつかあります。 しかしそのいずれも、「オブジェクトのコピー」や「参照をコピーします」等といったキーワードが多数出てきます。 そしてそのキーワードの「本当の意味」が分からないままその本を熟読しても、「自分なりの解釈」で納得してしまうので、読み進めていくうちに「?」がいっぱいでてきて行き詰ってしまうのです。 何か必要にせまられてVB.netを選択しているのでしょうか? 時間的に余裕があり、「プログラムの勉強」をテーマとしているのならば、CやC++を基礎からやるのがお勧めです。 なぜなら、プログラミングの基礎が「本当の意味」で身につくからです。 VB.NETの開発をVisual Studioでやっていると思いますが、これは 「あまりにも便利すぎる」開発環境であると私は思っています。 VB.netは開発が楽ですし、あまりプログラムの内容を意識しなくても 「なんとなく」動く物ができてしまいます。 だから、rescue98さんのやろうとしているような、オブジェクトの概念必要な「オブジェクトのやり取り」や「プロパティ」の実装のところで躓いてしまうのです。 まずは、オブジェクトとはなにか?値型とは何か?参照とはなにか? という概念自体をしっかりと身に着ける必要があるのではないでしょうか? CやC++は、メモリの扱いや参照、値型などの知識がないと まともに動く物が作れません。 そういった意味で、VB.netを選択するのは危険だと思います。 CやC++を勉強しようとしたとき、 あまりにも「何を」していいのか分からず、聞く人もいないので、 簡単に勉強を始めることができる.NET関連の本を手に取ってしまうことは良くあります。 かといって、.NETが内部でどういう動きをしているのか? を理解し、きちんと設計ができるようになるまでの時間は、 C++を知っている人とそうでない人との違いは雲泥の差があります。 rescue98さんが最初に立てた 「オブジェクトに値を保持させるにはプロパティに追加ですか?」 という質問から相当ずれてきてしまっているので、 一旦〆られて、 別途 「参照型、値型の概念を身に付けるお勧めの方法は?」などのトピックを新しく作られてみてはどうでしょうか? 老婆心からいろいろと記述してしまい申し訳ございません。

rescue98
質問者

お礼

ありがとうございます。 Cは読みました。あのC言語を作った人の「プログラミング言語C」という本を読みました。 JAVAもEclipseにVisual Editorを入れてテーブルデータモデルを適用した表を作ってみました。 CはGUIがむずい。 JAVAはいろいろ別の仕組みを導入していかないと開発できない。 JUnitなど。 あとJAVAは継続した一環した開発が出来にくい環境だと判断しました。 そこでC#かVBかとなったわけですが、Visual C#かVisual BasicならVBを選ぶでしょう。 >VB.NETの開発をVisual Studioでやっていると思いますが、これは「あまりにも便利すぎる」開発環境であると私は思っています。 VBは簡単。誰でも出来る。 VBが出来るというとみんな口を揃えてそう言います。 ・・・ならなぜ簡単なVBで開発しないの?と思ってしまいます。 今は勉強中なので基礎がわかってませんが、一通り本を読んで、VBを習得すると決めました。 ということで、本を読み進めたいと思います。 またよろしくお願いしますmm

その他の回答 (3)

回答No.3

共有プロパティって、 静的メンバ、つまりSharedのことですよね。 値渡しと参照渡し、また静的メンバ の事をよく知らずに使ってしまうと特にマルチスレッドのプログラムを作る時にえらい事になるので。 今は使わないほうがいいでしょう。 まだ コピーできなくて うんうん悩む方がましです(笑) >>プロパティ設定済みのオブジェクトをオブジェクト型に代入すると>>プロパティは付いてきますか? ざっくり言うと、 そのプロパティが「値型(integetとかVB.netで用意されている型)」ならついてきますし、 「参照型(オブジェクト)」なら、参照のコピー。(つまり、ショートカットのコピー) が渡されます。  値型、参照型については調べてみて下さい。 どちらでコピーしても、 オブジェクトを代入した変数から、対象となるプロパティを見たら値が取れるはずです。 そもそも取れないというのは「オブジェクト参照がどうのこうの~」って例外がでるんですか? それなら多分コーディングが間違ってると思うので、 ソースUPする方が早いかもしれません。 って、VB.net VS2005のつもりで話ししてますがあってますか? とりあえず、 参考URL先に オブジェクトの中身を全部コピーする方法があるのでやってみてください。

参考URL:
http://blogs.wankuma.com/jeanne/archive/2006/04/07/22287.aspx
rescue98
質問者

お礼

ありがとうございます。 もうじき?Visual Studio 2010が出るので、 出たらすぐ使えるようにするために、Visual Studio 2005を先に本で勉強しています。 本にはこう書いていました。 オブジェクト参照はオブジェクトのアドレスのコピーが渡される。←これは参照渡しのことですね。 オブジェクト参照をプロシージャに渡し、元のオブジェクトに影響を与えないようにするには、オブジェクトのコピーを自分で作成します. オブジェクトのコピーは、新しいオブジェクトを生成し、すべてのプロパティを正しく初期化する必要があります。←ここで? オブジェクトのプロパティの数が多い場合は、コードがかなり必要になります。←???? 以上のことが書いていました。 プロパティがあると初期化しないといけない、その数分コードを書かないといけない・・・と判断しました。 この3行目で?になったので、先に進めません・・・ 本を何回か解読して、わかったかも知れません! これは「参照渡しの値渡し」のことなのかもしれません。 ByRefキーワードの引数を()で囲むことで引数を値渡しにできます。 参照渡しの値渡しは、プロパティが引き継がれないということかなという結論に達しました。 参照渡しの値渡しは、プロパティは自力で入れる必要がある。ということで合っていますか?

回答No.2

>>クラスからオブジェクトをインスタンス化させて実体を作るわけですよね。 そうです! >>その実体に値を保持させるには、プロパティに代入すると、他のクラ>>スからその実体のプロパティに値を代入していくのかと思いました。 ですね。プロパティ経由で、クラスが持っている値を変更することができます。 しかし、そのオブジェクト(クラス)のプロパティは 「何の為に存在しているのか」をよく考えて外部に公開したり、しなかったりを考えて作ってください。 例えば、私自身のオブジェクト(クラス)は、以下のように表現できます。 ''' ◆Unripe01のオブジェクトです。 Public Class Unripe01 'クラス内のみで使う変数です。(プロパティ用) Private _Caption As String Private _Name As String Private _Age As Integer ''' コンストラクタ Public Sub New() _Name = "Unripe01" _Age = 60 End Sub '''*-- Unripe01の名前 Public ReadOnly Property Name() As String Get '他の人に名前の変更をされたら困るので、ReadOnly Return _Name End Get End Property '''*-- Unripe01の年齢 Public ReadOnly Property Age() As Integer Get '他の人に年齢の変更をされたら困るので、ReadOnly Return Age End Get End Property '''*-- Unripe01の説明 Public Property Caption() As String Get Return _Caption End Get Set(ByVal value As String) 'Unripe01の評判は他の人から判断されるのでSetできる。 _Caption = value End Set End Property End Class これを、ほかの人が操作する場合は、 ''' メイン処理 Private Sub Main() 'コンストラクタを呼んで、Unripeのインスタンス化 Dim unripe As New Unripe01() 'Unripe01の評価を下します。 unripe.Caption = "この人の説明は分かりづらいです。" End Sub こんな感じで。 >>クラスをパブリックにしても他のクラスからアクセスできるのですね。 これはプロパティの誤り?かと思いますが、 VB.netではクラスは元々パブリックです。Privateにする為には、Publicなクラスの内部クラスとして宣言する必要があります。 が、最初はそういうクラス設計をしないように、クラスを組み立てて言ってください。 上記例で言えば、Unripe01クラスのプロパティに、Unripe02さんのオブジェクトやプロパティがあったらUnripe01オブジェクトの存在意義が分からなくなってしまいますよね。 「1オブジェクトは、一つの何かを表す。」 という事をいつも前提に置いてください。 >>オブジェクトをコピーするとプロパティは初期化されるそうです>>が、プロパティ設定を維持したままオブジェクトはコピーできないん>>ですか? 結論から言うと、コピーできます。 おっしゃっているオブジェクトのコピーについては、 「値渡し」と「参照渡し」という概念や、「シャローコピー」「ディープコピー」ついて、検索したら色々とサイトが出てくると思いますが、奥が深いです。 「値渡し」と「参照渡し」については 以下のようなイメージです。 (1)Windowsでテキストファイルを作ってください。 (2)そのフォルダのショートカットを作ってください。 (3) (1)のファイルをコピーしてください。(コピー~ファイル名というのができる) (1)を開いても、(2)を開いても、元々の(1)を開きますよね? そして(3)は値渡しです。 乱暴に説明してしまうと、その実態オブジェクト(テキストファイル)へのショートカットを見るか、直接コピーするのかが「値渡し」「参照渡し」の違いです。 「コピーできない」と心配しているのは、元々のファイルを消してしまうと、(2)では開けないですよね。 イメージなので、かなり乱暴に説明しているので、、、申し訳ないですが、実際の動きはもう少し違います。 あまり考えすぎると、顔がこわばってしまうので、のんびり勉強してください。

rescue98
質問者

お礼

ありがとうございます。 値渡しでも参照渡しでもプロパティは保持されてオブジェクトに付いてくるのですね。 最後に質問ですが、 プロパティ設定済みのオブジェクトをオブジェクト型に代入するとプロパティは付いてきますか? オブジェクトに代入したらプロパティがくっ付いてこないので、共有プロパティを使うのかなと考えています。 「オブジェクトにオブジェクトを代入すること」と「コピー(値渡し・参照渡し)」は同じことをただ言い方を変えただけなような気がしてきました。 そうすると、共有プロパティの使い道がない・・ プロパティどころか共有プロパティの使いどころすらわからなくなってきました。 複雑ですね。ちょっと考えます・・・

回答No.1

はじめまして。 オブジェクトとは、クラスの作成を検討しているのでしょうか? クラス自身に値を保持させる方法という解釈で、以下ご回答します。 通常、クラスに値を保持させるには クラス自身の変数、またはプロパティを宣言します。 Privateなフィールドであれば、 クラス変数にしてもプロパティにしても問題がないように思います。 Publicで、外部に公開する場合も、 プロパティを作成したり、 「Public A As String」のように宣言しても使用可能です。 でも、プロパティを使っておくと、 外部に公開されている、機能の実装の修飾であると明示化できるので、 プロパティを推奨します。 稚拙な回答ですが、参考になればいいかと・・・

rescue98
質問者

お礼

ありがとうございます。 クラスからオブジェクトをインスタンス化させて実体を作るわけですよね。 その実体に値を保持させるには、プロパティに代入すると、他のクラスからその実体のプロパティに値を代入していくのかと思いました。 クラスをパブリックにしても他のクラスからアクセスできるのですね。 参考になりました。 オブジェクトをコピーするとプロパティは初期化されるそうですが、プロパティ設定を維持したままオブジェクトはコピーできないんですか? プロパティ指向型言語がよくわかりません・・・

関連するQ&A

  • VBAのオブジェクトの値を保持しておくには

    ExcelのVBAにおいて、Deleteメソッドを使用して、 オブジェクトを削除する場合に、削除前に保持データを丸々待避させる よい方法はないでしょうか。 例)グラフタイトルのフォントスタイルを書き戻す。 1. ActiveChart.ChartTitle.Fontの内容を待避させる。 2. Deleteでタイトルを消す。 ActiveChart.ChartTitle.Delete 3. 間に種々処理を行う。 4. 新しいタイトルをつける。 ActiveChart.HasTitle = True ActiveChart.ChartTitle.Characters.Text = "foo" 5. ActiveChart.ChartTitle.Fontの内容を新しいタイトルに適用する。 プロパティーを列挙して変数に格納する方法を試したましたが、 プロパティーの数だけコードを書かなければならないので断念しました。 通常の変数であれば、 1. 規定値をセット(A=1) 2. 退避用の変数にAを保持させる(B=A) 3. Aに対して操作を行う 4. 待避した値をAに書き戻す(A=B) というようなことができるのですが。 オブジェクトにSet等を試しましたが、Setを使ってオブジェクトを入力した場合、 もとオブジェクトの変化に対して動的に値が変化するため、待避できませんでした。 どなたか、わかる方がいらっしゃいましたら、よろしくお願いいたします。 使用環境 WindowsXP SP2 Excel 2002 SP3

  • ユーザーコントロールのプロパティの値の保持

    ユーザーコントロールを作成して、使用しているのですが、独自のプロパティを作成し、実際に配置した複数のコントロールで、各々値を設定しても、プロジェクトを一度閉じてしまうと、その他プロパティの値が保持されません。 何か基本的なことを見落としているような気がするのですが、行き詰ってしまいました。 解る方いらっしゃいましたら、アドバイスお願いいたします。

  • VBAでオブジェクトのプロパティの値を変えたい

    エクセル2010のマクロの話なのですが、 添付画像にある、オブジェクトの「Value」というプロパティーの値を変更するための文法がわかりません。  PsyBcLbll.Value=13342353654 という感じで書いているんですが, たしか、 「変数が宣言されていない」 とかいうエラーが出てうまくいきませんでした。 一体、どう書けばいいんでしょうか?

  • オブジェクトやプロパティ、メソッドに付いて

    今、JavaScriptを覚えようとしてるのですが、オブジェクトから訳が分からなくなってきました。 ゲームに例えたら、自機がオブジェクトで、プロパティが自機のステータスで、 メソッドがいろいろな動作をさせる関数って感じでいいんでしょうか? それと、オブジェクトは下のようにメソッドやパラメータを使用しますが、 パラメータ=="値" って感じなのでしょうか?? オブジェクト名.メソッド名(パラメータ); オブジェクト名.プロパティ名="値"; よろしくご指導お願いします。

  • 【ExcelVBA】シートのCodeNameプロパティからオブジェクトを取得する方法

    いつも勉強させていただいてます。 業務でExcelVBAを使用していますが、ワークシートのCodeNameプロパティ値からワークシートオブジェクトを取得する方法はありますでしょうか。 以下、詳細です。 ・環境:Excel2003 ・概要    ワークシートのオブジェクト名:"shtFormat"    シート名:"フォーマット"  ガントチャートを作成するVBAなのですが、上記のシートをコピーして、実際に処理に使用するシートを作成します。  作成後も、ユーザフォームや別のデータ操作用ワークシートのイベントから操作するため、コピーしたシートを特定する情報を内部で保持しようと考えています。  そこで、CodeNameプロパティ値を保持しようと考えておりますが、CodeNameプロパティ値(文字列)からワークシート型のオブジェクトを取得する方法が分かりません。 ※ Nameプロパティはシート名を変更した際に使用できなくなり、断念しました。 ※Indexプロパティはシートの並び順によって値が変わるため、断念しました。 以上です。 宜しくお願い致します。

  • 既存オブジェクトに対するプロパティの追加

    既存オブジェクトに対してプロパティを追加したいと思っています。 具体的には(後述しますが)ファイル・フォルダオブジェクトに対してです。 (1)自分で作ったオブジェクトの場合 var huga = {}; huga.hoge = "123"; こうするだけで「hoge」プロパティを追加できますよね。 (2)一般的なオブジェクトの場合 Object.prototype.hoge = "123"; とすれば「hoge」プロパティを追加できますよね。 ここまでは知っていました。で、それを踏まえて同じように追加しようと、(1)(2)ともにためしてみたのですがうまくいきませんでした…。 文末のコードでは「item」の配列と、「newName」の配列を別に用意し処理しています。ただ、オブジェクトの意味合いからして、各独立に配列を用意するのはダサすぎます。で、item自体に「newName」プロパティを追加しようと思ったのですがこれがうまくいきませんでした。 ◎質問 ・この「item」オブジェクトにプロパティを追加することは出来るか ・出来ないのならなぜ出来ないのか。(拡張不可属性とかあるの?) ・出来るのならその方法 ※htaアプリなので、IEで動けばOKです。 以上、よろしくお願いします。 <html> <body> <input type="button" onclick="ファイル一覧取得()" value="ファイル一覧取得"> <div id="files"></div> <script> var folderItemsArray = []; var newFileNamesArray = []; // (2)で出来なかった例 // Object.prototype.newName = "123"; // FolderItem.prototype.newName = "123"; // Folder.prototype.newName = "123"; // Item.prototype.newName = "123"; function ファイル一覧取得() { folderItemsArray = []; newFileNamesArray = []; var FOLDER_PATH = "C:\\WINDOWS"; // ★ファイル・フォルダの一覧取得 var shell = new ActiveXObject("Shell.Application"); var folderItems = shell.NameSpace(FOLDER_PATH).Items(); var regOpt = "i"; for (var i = 0; i < folderItems.Count; i++) { // ↓このオブジェクトに「newName」を追加したい var item = folderItems.Item(i); if (!item.IsFolder) { newFileNamesArray.push("…"); // ↑別配列を操作している辺りがダサい // ↓本当はこんな感じにしたい。(1)で出来なかった例 // item.newName = "…"; folderItemsArray.push(item); } } 一覧表示(); } /** * ファイル一覧表示 */ function 一覧表示() { var body = ''; for (i = 0; i < folderItemsArray.length; i++) { var item = folderItemsArray[i]; body += "<tr>"; body += "<td>" + item.Size; body += "<td>" + item.Name; body += "<td>" + newFileNamesArray[i]; // ↑別配列を操作している辺りがダサい // ↓本当はこんな感じにしたい // tbodyStr += "<td>" + item.newName; } var table = '<table border="1" cellspacing="0">'; table += body; table += "</table>"; document.getElementById("files").innerHTML = table; } </script> </body> </html>

  • なぜiは変数の値が保持されるのに、wは保持されない

    なぜiは変数の値が保持されるのに、wは保持されないのでしょうか? Sub test() Dim w As Worksheet Dim i As Long i = 1 For Each w In Worksheets i = i + 1 Next MsgBox i MsgBox w.Name End Sub -------------------------------------- を行うと、 MsgBox i は表示されるのに、 MsgBox w.Name は、 「オブジェクト変数または With ブロック変数が設定されていません。」になります。 wはオブジェクト変数だから、 For Each ステートメントを抜けると値が破棄されてしまうのでしょうか? でもvbaのヘルプの 「For Each...Next ステートメントの使い方」 を見ても 「ステートメントを抜けるとオブジェクト変数なら値が破棄されます」 と記載されていません。

  • (VBA)ブックを開いている間、常に値を保持したい

    お世話になります。holmonと申します。 Excelブックを開いている間、値を常に保持しておきたいのですが、方法はありますか? 具体的にやりたいこと↓ 1.WorkBook_Openにてオブジェクト取得 2.上記を保持 2.ユーザーがExcel操作 3.ユーザーがExcel上のボタンを押す 4.イベント実行 4.のタイミングで、1.で取得した値を使いたいです。よろしくお願い致します。

  • ExcelVBAのオブジェクトとプロパティについて

    ネットだけで独学でVBAの勉強をしています。大雑把ですがオブジェクトとプロパティの認識はこんなものでよろしいのでしょうか。 オブジェクト=モノ(色々なものが集合して出来たモノ) プロパティ=モノが持っている動詞(例えば人間がオブジェクトとするなら、手を上げるなど、動作を言う)

  • 「戻る」ボタンで値の保持

    PHPやCGIなどで同じファイルにデータをポストした後に、ブラウザの「戻る」ボタンで戻ったときに「ページの有効期限切れ」になってしまうのですが、回避する方法はないでしょうか。 元のページとフィールドに入れた値を保持することはできないでしょうか。 他のファイルからポストしない限り値の保持は難しいのでしょうか。

    • 締切済み
    • PHP

専門家に質問してみよう