• ベストアンサー

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

あんらいぷ ぜろいち(@Unripe01)の回答

回答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
質問者

お礼

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

関連する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