- ベストアンサー
オブジェクトに値を保持させるにはプロパティに追加ですか?
オブジェクトに値を保持させるにはプロパティに追加ですか? 新たなプロパティを作成してそこに保持する方法でいいですか? ほかのやり方がありますか?
- みんなの回答 (4)
- 専門家の回答
質問者が選んだベストアンサー
ううん・・・ 参照渡しの値渡しという言葉の意味が良く分かりません・・・ すいません。 内部クラスをプロパティに持つクラスを 値渡ししたい場合は、 その内部のクラスを自力でコピーしないとだめです。 所感で申し訳ございませんが、参照型、値型、参照渡し、値渡しがどういったものがきちんと掴めていないまま クラスのプロパティのやり取りを行おうとしているように感じます。 少し学習の順序が違うのではないでしょうか? 確かに販売されているVB.netの書籍には、分かりやすい本はいくつかあります。 しかしそのいずれも、「オブジェクトのコピー」や「参照をコピーします」等といったキーワードが多数出てきます。 そしてそのキーワードの「本当の意味」が分からないままその本を熟読しても、「自分なりの解釈」で納得してしまうので、読み進めていくうちに「?」がいっぱいでてきて行き詰ってしまうのです。 何か必要にせまられてVB.netを選択しているのでしょうか? 時間的に余裕があり、「プログラムの勉強」をテーマとしているのならば、CやC++を基礎からやるのがお勧めです。 なぜなら、プログラミングの基礎が「本当の意味」で身につくからです。 VB.NETの開発をVisual Studioでやっていると思いますが、これは 「あまりにも便利すぎる」開発環境であると私は思っています。 VB.netは開発が楽ですし、あまりプログラムの内容を意識しなくても 「なんとなく」動く物ができてしまいます。 だから、rescue98さんのやろうとしているような、オブジェクトの概念必要な「オブジェクトのやり取り」や「プロパティ」の実装のところで躓いてしまうのです。 まずは、オブジェクトとはなにか?値型とは何か?参照とはなにか? という概念自体をしっかりと身に着ける必要があるのではないでしょうか? CやC++は、メモリの扱いや参照、値型などの知識がないと まともに動く物が作れません。 そういった意味で、VB.netを選択するのは危険だと思います。 CやC++を勉強しようとしたとき、 あまりにも「何を」していいのか分からず、聞く人もいないので、 簡単に勉強を始めることができる.NET関連の本を手に取ってしまうことは良くあります。 かといって、.NETが内部でどういう動きをしているのか? を理解し、きちんと設計ができるようになるまでの時間は、 C++を知っている人とそうでない人との違いは雲泥の差があります。 rescue98さんが最初に立てた 「オブジェクトに値を保持させるにはプロパティに追加ですか?」 という質問から相当ずれてきてしまっているので、 一旦〆られて、 別途 「参照型、値型の概念を身に付けるお勧めの方法は?」などのトピックを新しく作られてみてはどうでしょうか? 老婆心からいろいろと記述してしまい申し訳ございません。
その他の回答 (3)
- あんらいぷ ぜろいち(@Unripe01)
- ベストアンサー率84% (11/13)
共有プロパティって、 静的メンバ、つまりSharedのことですよね。 値渡しと参照渡し、また静的メンバ の事をよく知らずに使ってしまうと特にマルチスレッドのプログラムを作る時にえらい事になるので。 今は使わないほうがいいでしょう。 まだ コピーできなくて うんうん悩む方がましです(笑) >>プロパティ設定済みのオブジェクトをオブジェクト型に代入すると>>プロパティは付いてきますか? ざっくり言うと、 そのプロパティが「値型(integetとかVB.netで用意されている型)」ならついてきますし、 「参照型(オブジェクト)」なら、参照のコピー。(つまり、ショートカットのコピー) が渡されます。 値型、参照型については調べてみて下さい。 どちらでコピーしても、 オブジェクトを代入した変数から、対象となるプロパティを見たら値が取れるはずです。 そもそも取れないというのは「オブジェクト参照がどうのこうの~」って例外がでるんですか? それなら多分コーディングが間違ってると思うので、 ソースUPする方が早いかもしれません。 って、VB.net VS2005のつもりで話ししてますがあってますか? とりあえず、 参考URL先に オブジェクトの中身を全部コピーする方法があるのでやってみてください。
お礼
ありがとうございます。 もうじき?Visual Studio 2010が出るので、 出たらすぐ使えるようにするために、Visual Studio 2005を先に本で勉強しています。 本にはこう書いていました。 オブジェクト参照はオブジェクトのアドレスのコピーが渡される。←これは参照渡しのことですね。 オブジェクト参照をプロシージャに渡し、元のオブジェクトに影響を与えないようにするには、オブジェクトのコピーを自分で作成します. オブジェクトのコピーは、新しいオブジェクトを生成し、すべてのプロパティを正しく初期化する必要があります。←ここで? オブジェクトのプロパティの数が多い場合は、コードがかなり必要になります。←???? 以上のことが書いていました。 プロパティがあると初期化しないといけない、その数分コードを書かないといけない・・・と判断しました。 この3行目で?になったので、先に進めません・・・ 本を何回か解読して、わかったかも知れません! これは「参照渡しの値渡し」のことなのかもしれません。 ByRefキーワードの引数を()で囲むことで引数を値渡しにできます。 参照渡しの値渡しは、プロパティが引き継がれないということかなという結論に達しました。 参照渡しの値渡しは、プロパティは自力で入れる必要がある。ということで合っていますか?
- あんらいぷ ぜろいち(@Unripe01)
- ベストアンサー率84% (11/13)
>>クラスからオブジェクトをインスタンス化させて実体を作るわけですよね。 そうです! >>その実体に値を保持させるには、プロパティに代入すると、他のクラ>>スからその実体のプロパティに値を代入していくのかと思いました。 ですね。プロパティ経由で、クラスが持っている値を変更することができます。 しかし、そのオブジェクト(クラス)のプロパティは 「何の為に存在しているのか」をよく考えて外部に公開したり、しなかったりを考えて作ってください。 例えば、私自身のオブジェクト(クラス)は、以下のように表現できます。 ''' ◆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)では開けないですよね。 イメージなので、かなり乱暴に説明しているので、、、申し訳ないですが、実際の動きはもう少し違います。 あまり考えすぎると、顔がこわばってしまうので、のんびり勉強してください。
お礼
ありがとうございます。 値渡しでも参照渡しでもプロパティは保持されてオブジェクトに付いてくるのですね。 最後に質問ですが、 プロパティ設定済みのオブジェクトをオブジェクト型に代入するとプロパティは付いてきますか? オブジェクトに代入したらプロパティがくっ付いてこないので、共有プロパティを使うのかなと考えています。 「オブジェクトにオブジェクトを代入すること」と「コピー(値渡し・参照渡し)」は同じことをただ言い方を変えただけなような気がしてきました。 そうすると、共有プロパティの使い道がない・・ プロパティどころか共有プロパティの使いどころすらわからなくなってきました。 複雑ですね。ちょっと考えます・・・
- あんらいぷ ぜろいち(@Unripe01)
- ベストアンサー率84% (11/13)
はじめまして。 オブジェクトとは、クラスの作成を検討しているのでしょうか? クラス自身に値を保持させる方法という解釈で、以下ご回答します。 通常、クラスに値を保持させるには クラス自身の変数、またはプロパティを宣言します。 Privateなフィールドであれば、 クラス変数にしてもプロパティにしても問題がないように思います。 Publicで、外部に公開する場合も、 プロパティを作成したり、 「Public A As String」のように宣言しても使用可能です。 でも、プロパティを使っておくと、 外部に公開されている、機能の実装の修飾であると明示化できるので、 プロパティを推奨します。 稚拙な回答ですが、参考になればいいかと・・・
お礼
ありがとうございます。 クラスからオブジェクトをインスタンス化させて実体を作るわけですよね。 その実体に値を保持させるには、プロパティに代入すると、他のクラスからその実体のプロパティに値を代入していくのかと思いました。 クラスをパブリックにしても他のクラスからアクセスできるのですね。 参考になりました。 オブジェクトをコピーするとプロパティは初期化されるそうですが、プロパティ設定を維持したままオブジェクトはコピーできないんですか? プロパティ指向型言語がよくわかりません・・・
お礼
ありがとうございます。 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