オブジェクトとインスタンスの違いがわかりません。
以下はvb.netの本からの抜粋です。
グラフィックスの描画をするためのコードです。
ピクチャーボックスへのグラフィックス処理を行うためのグラフィックオブジェクトをgに取得する
グラフィックスオブジェクトgは、絵を描くキャンパスに相当する
Dim g as Graphics = PictureBox1.CreateGraphics()
Dim pen as new Pen(Color.Black)
g.DrawLine(mypen,x1,y1,x2,y2) //x1,y1は始点(描き始めの座標)、
// x2,y2は終点(描き終わりの座標)を表しています
疑問点としては、変数Penはnew でインスタンス化したものを入れているのに、
なぜ、変数g にはnewをしたものを入れなくてはいいのかです。
ネットで調べるとオブジェクトは型と書いていたのですが、
インスタンス化せずに型のままでは描画できないのではないか?
インスタンス化して初めて描画のためのオブジェクトが作成されるのではないか?
と疑問が残ったのでこちらで質問させていただいています。
気になる質問をクリップする
クリップした質問は、後からいつでもMYページで確認できます。
またクリップした質問に回答があった際、通知やメールを受け取ることができます。
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
回答7件
0
「言語問わず」とありますので、一般論から述べます。
プログラミング言語でオブジェクト(object)といった場合、その言語において直接扱える何かをさします。だいたい次のような性質を持っています。
- 何らかの型がある。
- 変数に代入できる。
- 関数(メソッド)の引数にできる。
- 関数(メソッド)の戻り値にできる。
- それ自体が式であり、任意の式の一部となれる。
※ 静的型付けの場合は、型があっていればという条件があります。
つまり、言ってみれば何らかのデータです。整数であったり、浮動小数点数であったり、文字列であったり、構造体であったり、関数であったり、クラスのインスタンス(後述)であったり、言語によって様々です。これらの性質を直接持つ物を第一級オブジェクト、間接的に同様の事ができる物を第二級オブジェクトと言ったりします。
注意すべきは、オブジェクトはオブジェクト指向だけの概念ではないと言うことです。オブジェクト指向を考慮していないC言語でも整数(int等)や浮動点数少数(double等)、構造体(struct)等のデータはオブジェクトと言います。オブジェクト指向は、こういったオブジェクトを中心に据えてプログラミングする手法なので、オブジェクト指向と言っているに過ぎません。
なお、ここでのオブジェクトは型の事ではありません。何らかの型のデータ自体のことです。ただし、型自体がオブジェクトになる言語も存在します。
さて、次にインスタンス(instance)は、これはオブジェクト指向だけの概念です。クラス(プロトタイプベースの場合はプロトタイプとなるオブジェクトになりますが、以下クラスとまとめて考えます)はオブジェクトの雛形です。その雛形から実際のデータをもつオブジェクトにすることを実体化(インスタンス化)と言い、そのオブジェクトはそのクラスのインスタンスと言われます。
つまり、逆に言うと、インスタンスは何らかのクラスを実体化したオブジェクトであると言えます。インスタンスは常にオブジェクトです。しかし、オブジェクトが必ずしもインスタンスであるとは限りません。言語によってはクラス以外の型が存在し、クラスのインスタンスではないオブジェクト(よくプリミティブ型とか言われる)がある場合もあります。これは言語によって異なり、逆に全てが何からのインスタンスであるという言語もあります。
さて、ここまでは良いですね。こっからが混乱を招くかも知れないところです。言語によってはObjectというクラスが用意されている場合があります。だいたいは最も底にある基底クラスであり、全てのクラスはObjectクラスの派生にすぎないように設計されている場合があります。Objectもクラスですので、Objectクラスのインスタンスも存在します。これをObjectクラスのオブジェクトと言ったりします。
さらに、混乱することを言います。先ほどObjectクラスというものを見てきました。言語によっては、このようなObjectクラスまたはObjectクラスの派生クラスのインスタンスであるオブジェクトをまとめて「オブジェクト型のオブジェクト」と言ったりします。何言っているのかわからない…という感じですが、オブジェクト型では無いオブジェクトもある言語では、それらを区別するためにこのような表現を使います。
もう何が何だがわからない感じですが、実は英語の文章だったらはっきり違いがわかります。「オブジェクト型」と言った場合のオブジェクトはObject(固有名詞)ですが、単にオブジェクトと言ったときはobject(一般名詞)です。日本語の文章にしてしまうと英語の大文字小文字が無くなってしまうのでわかりにくくなっているだけに過ぎません。難しいところですが、文脈によって把握するしかありませんが、元になった英語の文章を読むと理解しやすいかも知れません。
投稿2016/08/06 21:05
総合スコア21737
0
こんにちは。
まず、オブジェクトと言う用語は文脈によって意味が代りますので、あまり厳密に捉えない方がよいです。
クラス型のことをオブジェクトと表現することもあれば、インスタンスのことをオブジェクトと表現することもあります。クラスもインスタンスもごたまぜにしたオブジェクト指向という概念でとらえた方がすっきりするかも知れません。
疑問点としては、変数Penはnew でインスタンス化したものを入れているのに、
なぜ、変数g にはnewをしたものを入れなくてはいいのかです。
このケースでは単に、PictureBox1.CreateGraphics()の内部でnewしたものを返却しているだけではないかと思います。
投稿2016/08/06 05:17
総合スコア23272
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
0
ベストアンサー
ご質問の表題と内容に若干の飛躍があるように思います。内容の方に関しては他の方が説明されているように、メソッド(関数)の中でnewされていると考えれば簡単に疑問は解決すると思われます。
その上でこちらもチェックしておいていただきたいのですが、インスタンス化しなくても使えるクラス(型)自体に属するメンバ(変数、関数、フィールド、プロパティ、メソッド等々)も存在します。これはプログラムが開始されたときにプログラムのどこかに一カ所だけ最初から作られるものです。この場合、クラスをインスタンス化しなくてもそれらのメンバを使うことが可能です。言語によってやり方は違いますが、通常のメンバとは定義の方法が少し違うはずです。また、名称もクラス自体に属するのでクラスメンバといったり、最初から存在するので静的メンバといったりします。
さて、表題はもっと一般的な話になりますね。言葉の定義は文脈で全く違った意味になることもありますが、一般論の1つとして考えていただき、確認はご自身でお願いします。
インスタンスという言葉が我々の世界(情報工学界?)に広まったのはオブジェクト指向が知られるようになってからだと思います。それまでも、オブジェクトという言葉はありました。c言語のファイルをコンパイルすると拡張子 o のファイルができて、それをオブジェクトファイル、と言ったり。まぁ、単なる「物」ですから、なんにでも当てはめようと思えば当てはめられてしまいますが。
インスタンスというのはオブジェクト指向の用語で、クラスを実体化したオブジェクトのことをいいます。なので、インスタンスはオブジェクトですが、オブジェクトはインスタンスであるとは限らず、イコールではありません。
たとえば、上記のクラスメンバ(クラスをインスタンス化しなくても使えるメンバ)はプログラムがロードされ、意図したプログラムが動き出す前に既に存在する状態になります。つまり、インスタンス化しないオブジェクトということができます。
このような答えでご納得されましたか?
投稿2016/08/19 12:54
退会済みユーザー
総合スコア0
0
クラスをインスタンス化したものがオブジェクトだそうです。
なので、
Dim pen as new Pen(Color.Black)
Penクラスのインスタンスをnew命令で作成して、出来上がったオブジェクトをpenに代入している。
みたいに捉えると良いのではないでしょうか。
Dim g as Graphics = PictureBox1.CreateGraphics()
こちらの場合は、恐らくCreateGraphicsメソッドの中で、
Graphicsクラスをnewして返しているのだと思います。
恐らくというのは、もしかしたら更に別のメソッドを呼んで作っている可能性もあるから。
でもインスタンスとオブジェクトは、ほとんど同じ意味で使うことが多いように思います。
投稿2016/08/06 11:43
総合スコア2208
0
インスタンス化して初めて描画のためのオブジェクトが作成されるのではないか?
その通りです。この一文をみるとすでにご自身で理解されてるように見えます。
質問への回答ではないのですが、皆さんと違った観点から話をすると、
一人で小さいプログラムを書いているとメリットがわかりにくいと思います。
Penのインスタンスを生成するのに、その場でnewをしていますが、あとからPenの種類が増える(Penを継承したサブクラスを用意する)のであれば、メソッドの中でnewをして(インスタンス化して)戻り値としてオブジェクトを返すようにするほうが変更箇所が少なくて済む(可能性が高い)です。
細かいことをいうとデザインパターンというものがあって、メソッドの戻りでオブジェクトを返すことはfactoryに分類されます。
投稿2016/08/06 21:06
総合スコア910
0
PictureBox1.CreateGraphics()ってCreateGraphicsメソッド内部でインスタンスを作って返しているか、静的なインスタンスを返しているかの何方かだと思います。
「オブジェクトは型」と書かれていたのは、Object型(若しくはobject型)のある言語の話だと思います。インスタンスとオブジェクトは同じものです。(前出のオブジェクト型は別の話)
投稿2016/08/06 15:39
総合スコア20
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
0
疑問点としては、変数Penはnew でインスタンス化したものを入れているのに、
なぜ、変数g にはnewをしたものを入れなくてはいいのかです。
大雑把に言うと、オブジェクト指向はデータに仕事をさせます。
当然、どのデータに仕事をさせるかを意識しなければいけません。
VB.NET
1Dim g as Graphics = PictureBox1.CreateGraphics()
PictureBox1へのグラフィックス処理を行うためのグラフィックオブジェクト
に対していろいろ操作をこの後したいわけですから、
どこかにある、「PictureBox1へのグラフィックス処理を行うためのグラフィックオブジェクト」を取ってこなければなりません。
VB.NET
1Dim pen as new Pen(Color.Black)
別に黒色のPenクラスのインスタンスならなんでもいいので新しく作ってます。
投稿2016/08/06 06:01
総合スコア13551
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
あなたの回答
tips
太字
斜体
打ち消し線
見出し
引用テキストの挿入
コードの挿入
リンクの挿入
リストの挿入
番号リストの挿入
表の挿入
水平線の挿入
プレビュー
質問の解決につながる回答をしましょう。 サンプルコードなど、より具体的な説明があると質問者の理解の助けになります。 また、読む側のことを考えた、分かりやすい文章を心がけましょう。
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
2016/08/07 11:43