質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.48%
C

C言語は、1972年にAT&Tベル研究所の、デニス・リッチーが主体となって作成したプログラミング言語です。 B言語の後継言語として開発されたことからC言語と命名。そのため、表記法などはB言語やALGOLに近いとされています。 Cの拡張版であるC++言語とともに、現在世界中でもっとも普及されているプログラミング言語です。

Java

Javaは、1995年にサン・マイクロシステムズが開発したプログラミング言語です。表記法はC言語に似ていますが、既存のプログラミング言語の短所を踏まえていちから設計されており、最初からオブジェクト指向性を備えてデザインされています。セキュリティ面が強力であることや、ネットワーク環境での利用に向いていることが特徴です。Javaで作られたソフトウェアは基本的にいかなるプラットフォームでも作動します。

オブジェクト指向

オブジェクト指向プログラミング(Object-oriented programming;OOP)は「オブジェクト」を使用するプログラミングの概念です。オブジェクト指向プログラムは、カプセル化(情報隠蔽)とポリモーフィズム(多態性)で構成されています。

プログラミング言語

プログラミング言語はパソコン上で実行することができるソースコードを記述する為に扱う言語の総称です。

JavaScript

JavaScriptは、プログラミング言語のひとつです。ネットスケープコミュニケーションズで開発されました。 開発当初はLiveScriptと呼ばれていましたが、業務提携していたサン・マイクロシステムズが開発したJavaが脚光を浴びていたことから、JavaScriptと改名されました。 動きのあるWebページを作ることを目的に開発されたもので、主要なWebブラウザのほとんどに搭載されています。

Q&A

解決済

10回答

402閲覧

オブジェクト指向のクラスって何ですか?

WeilSpinor

総合スコア170

C

C言語は、1972年にAT&Tベル研究所の、デニス・リッチーが主体となって作成したプログラミング言語です。 B言語の後継言語として開発されたことからC言語と命名。そのため、表記法などはB言語やALGOLに近いとされています。 Cの拡張版であるC++言語とともに、現在世界中でもっとも普及されているプログラミング言語です。

Java

Javaは、1995年にサン・マイクロシステムズが開発したプログラミング言語です。表記法はC言語に似ていますが、既存のプログラミング言語の短所を踏まえていちから設計されており、最初からオブジェクト指向性を備えてデザインされています。セキュリティ面が強力であることや、ネットワーク環境での利用に向いていることが特徴です。Javaで作られたソフトウェアは基本的にいかなるプラットフォームでも作動します。

オブジェクト指向

オブジェクト指向プログラミング(Object-oriented programming;OOP)は「オブジェクト」を使用するプログラミングの概念です。オブジェクト指向プログラムは、カプセル化(情報隠蔽)とポリモーフィズム(多態性)で構成されています。

プログラミング言語

プログラミング言語はパソコン上で実行することができるソースコードを記述する為に扱う言語の総称です。

JavaScript

JavaScriptは、プログラミング言語のひとつです。ネットスケープコミュニケーションズで開発されました。 開発当初はLiveScriptと呼ばれていましたが、業務提携していたサン・マイクロシステムズが開発したJavaが脚光を浴びていたことから、JavaScriptと改名されました。 動きのあるWebページを作ることを目的に開発されたもので、主要なWebブラウザのほとんどに搭載されています。

1グッド

6クリップ

投稿2019/03/17 02:39

オブジェクト指向のクラスって何ですか?

プログラミング初心者です。

オブジェクト指向の話で、
オブジェクトは概念で、インスタンスは実際に生命を吹き込まれた実体、と習いました。
つまり、

「『人間』はオブジェクトで、『アダム』や『イヴ』、『唐澤貴洋』はインスタンス」という感じです。

しかし、プログラミングの教科書を見ると、
「『人間』はクラス、『アダム』『イヴ』『唐澤貴洋』はオブジェクト」
と呼んでいるようでした。(第2の流派)

「あれ?流派の違い?」と思い、調べてみたら、あるサイトの説明では、

「『人間』はクラス、『アダム』『イヴ』『唐澤貴洋』はインスタンスです。そして、クラスもインスタンスもオブジェクトです。」

と言っていました。(第3の流派)

分かりづらいですが、とりあえず第3の流派を採用しようと思うのですが、
第3の流派における『オブジェクト』とはどういう意味でしょうか?

ご回答よろしくお願いします。

DrqYuto👍を押しています

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答10

0

たとえ話の是非

オブジェクト指向を理解するにあたって、概念をたとえ話として理解するのは、適切ではないです。(多くのたとえ話が破綻しています)
個人的見解ですが、技術をたとえ話で理解するのはエンジニアとして正しい理解に結びつかないです

用語の定義

具体的な技術用語として定義可能なのは「インスタンス」のみで、その他は文脈で判断する必要があります。

オブジェクト指向を理解するということ

それなりの経験をした人が、困った末に困った箇所に対応するための概念がオブジェクト指向です。困っていない間は、なかなか理解できないです。
困ってから理解すると良いです。

簡単に困れるのが「実務」なので経験をあまりショートカットできるものではないです。が、「デザインパターンにある例示」をうまく使えば、擬似的に困れるかも。

投稿2019/03/17 03:21

退会済みユーザー

退会済みユーザー

総合スコア0

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

WeilSpinor

2019/03/17 03:52

ご回答ありがとうございます。 実務経験で困った時に学べればそれが一番ですね。そのうち適当にバイト先でも見つけて仕事してみようかと思います。
guest

0

ベストアンサー

操作対象がオブジェクト(英単語のobjectの意味そのまま)で、オブジェクトを、クラスとの関係の中で考えたものをインスタンスというのが、一般的ではないでしょうか。

(プログラミング言語によっては、効率的な処理のために、数値や文字列などのよく使われる簡単な操作対象を、プリミティブ型等ということで、文法仕様上オブジェクトと別扱いしていますが、それは効率化のための都合で、概念的には気にしなくて良いと思います)

第3の流派における『オブジェクト』とはどういう意味でしょうか?

プログラミング言語によっては、「1が整数クラスのインスタンス」というのと同じく「整数クラスが、クラスクラスのインスタンス」という場合もあるわけで、その場合は、クラスもオブジェクトです。

投稿2019/03/17 03:30

otn

総合スコア84538

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

WeilSpinor

2019/03/17 03:57

ご回答ありがとうございます。 otnさまのご説明でようやくすっと理解出来ました。 おそらく、それが1番自然な解釈で、解釈に正解はないですから、とりあえずそういうものとしておぼえることにします。
guest

0

こんにちは。

オブジェクトは概念で、インスタンスは実際に生命を吹き込まれた実体、と習いました。
「『人間』はオブジェクトで、『アダム』や『イヴ』、『唐澤貴洋』はインスタンス」という感じです。

う~~ん、豪快な間違いと思います。(「人によって定義が異なる」程度の差ではないです。)
オブジェクト指向の潮流は確かに2つの流れがあります。クラス・ベースのものとプロトタイプ・ベースです。

前者は、設計図としてのクラスがあり、設計図(クラス)を元に作られた実体をインスタンス、もしくは、オブジェクトと呼びます。
後者は、そもそもクラス・ベースの意味の設計図(クラス)は存在せず、クローン(コピー)することでオブジェクトを増やします。なのでクラスやインスタンスという概念を含まないようです。

このどちらの概念に照らし合わせても、オブジェクトからインスタンスが作られるという表現は誤りです。

「『人間』はクラス、『アダム』『イヴ』『唐澤貴洋』はオブジェクト」

これはクラス・ベースの考え方と思います。しかし、間違いではないですが、あまり適切ではないです。人間という設計図があって、それから量産されたものがアダムやイヴではないです。生物は1つ1つの個体が異なる設計図(遺伝子)を持つのでちょっと無理を感じます。

「『人間』はクラス、『アダム』『イヴ』『唐澤貴洋』はインスタンスです。そして、クラスもインスタンスもオブジェクトです。」

こちらもクラス・ベースの考え方と思います。
上記との相違は、オブジェクトという用語の使い方の相違ですね。クラスとインスタンスをひっくるめて呼びたい時にオブジェクトと呼ぶこともあるようです。

因みに、オブジェクトという用語は実に曖昧です。オブジェクト指向プログラミングから離れるとオブジェクト・ファイルとかありますね。更にプログラミングから離れると、英文法で出てくるSVO等のOもオブジェクトですし。

投稿2019/03/17 03:32

Chironian

総合スコア23272

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

pepperleaf

2019/03/17 04:33

> 人間という設計図があって、それから量産されたものがアダムやイヴではないです。 "量産"という言葉には違和感はありますが、"異なる遺伝子..." 云々の世界は、細かな差異は無視しないと全体を見失うと思います。(ただし、細かな差異の定義は観察者の視点によって異なる) 工業製品の量産でも同じ図面、同じ鋳型で作成されても、個々の製品に個性(ばらつき)が発生します。また、Ver.Upも同じと見なす場合もあるので。
Chironian

2019/03/17 06:01

pepperleafさん、コメントありがとうございます。 プログラム設計上、HumanクラスからAdam、Eveなどのインスタンスを生成するケースはあると思います。 しかし、現実世界では、(アダムとイヴは分かりませんが)人は親から生まれるものですから、「人間」から「唐澤貴洋」が生まれると記述した時の「人間」は「唐澤貴洋」の親ですから、「唐澤貴洋」と同様にオブジェクトの位置づけに当たります。 つまり、唯でさえややこしいクラス・ベース/プロトタイプ・ベースの概念が入り混じって誤解を招きやすい記述なので、クラスとインスタンスの概念を理解していない人に対する説明としては不適切と感じるのです。
think49

2019/03/17 06:52 編集

> 人間という設計図があって、それから量産されたものがアダムやイヴではないです。 旧約聖書『創世記』では神がアダムとイブを作った」とあるので、神が class Human という設計図からアダムとイブを作ったと捉えれば、間違いではなさそうです。 その後の人間が生まれる仕組みは勿論、間違いですが…。
Chironian

2019/03/17 08:01

think49さん、コメントありがとうございます。 私も間違いではないと思います。しかし、「神様は『人間』の設計図を作り、その設計図からアダムとイヴを作った」的な話が一般的ならば良いのですが、そうではないので、クラスとインスタンスの関係を説明するためのたとえ話としては無理があるかと。 どちらかというと、アダム、イヴ、唐澤貴洋は人間の一員という意味で使われていると思います。これは is_a 関係ですので、更に混乱を招きそうです。(クラスとインスタンスの関係も is_a 関係があるので間違いではないのですが、クラスとインスタンスの関係の説明で持ち出す話ではないと思います。)
think49

2019/03/17 08:26

To: Chironian さん そうですね。 「神が『人間』という設計図を使ってアダムとイブを作ったのなら」という仮定(if)があるので、一般論でたとえ話に使う事はできませんね。 私も『人間』は種族としての意味合いが一般的で「new 人間でインスタンス(子供)を生成する」を現実世界に落とし込むのは無理があると思います。 種族名のインスタンスには、遺伝の仕組みがありませんので…。
WeilSpinor

2019/03/19 22:47

ご回答ありがとうございます。 そこまで考えていませんでした。 『人間』がclassの例えとして微妙だったとすれば、 『車』ならどうでしょうか? 車でしたら、人間みたいに繁殖によって作られるわけではないので、少しマシな例えだと思いました。 神は、長距離の移動に困った人類のために、class『車』を作りたもうた。 神は、class『車』を以下のように定めた: class『車』 【プロパティー】 用途、燃料、色、サイズ...etc 【メソッド】 前進する、バックする、止まる、ライトを点灯する、ウィンカーを出す、クランクを鳴らす、etc... instance『救急車』 【プロパティー】 用途: 医療用、燃料:ガソリン、色:白、サイズ:大、etc... instance『プリウス』 【プロパティー】 用途: 家庭用、燃料:電気、色:赤、サイズ:普通、etc...
Zuishin

2019/03/19 23:08

どんな優れたたとえでも完全一致しないので「この部分とこの部分は似てる」という話にとどまると思います。 たとえ話をする場合は「クラスは車です」で終わるのではなく、「クラスと車はこのような部分がこのような意味で似ています」と限定しなければなりません。でなければ読者は「クラスは車なんだ。じゃあなんでもできる高機能な万能クラスを作ろう」と思う危険があります。 クラスを最もよく表すたとえを見つけようとすることは昔から大勢の人がやっていますが、これは無意味な自己満足です。あくまでも説明を展開する上で必要な部分に文脈を限定して用いるべきです。
think49

2019/03/20 00:24

To: WeilSpinor さん 私が Chironian さんの意見を理解する範囲においては、『車』に置き換えてもおそらく、その理屈は通らないと思います。 『車』という基本設計図を元に『救急車』や『プリウス』の設計図を作るのでしょうか。 『車』という要件を満たすための要求仕様書はもちろんあると思いますが、それは設計図ではないと思います。 私なりに Chironian さんの意見を総括すると「現実の世界にあるものはオブジェクトで抽象化出来ない」になると考えています。 現実的に考えるなら、確かにそうです。 オブジェクト指向で抽象化出来るのは、コンピュータの中の仮想世界だからです。
Chironian

2019/03/20 05:49 編集

WeilSpinorさん なるほど。そのような設計は実際によくやることの1つと思います。 ただ、プログラミング初心者の方への説明と捉えると、クラスとインスタンスの関係の重要な部分について誤解を招きやすい表現のままとなっています。 「プリウスの設計図があり、それからA家のプリウス、B家のプリウスを生産する」という関係がクラスとインスタンスの重要な部分です。 しかし、WeilSpinorさんの説明は「救急車やプリウスは車である」という関係の例えを使ってクラスとインスタンスの説明をしていると思います。(繰り返しますが間違いではないです。) 「救急車やプリウスは車である」という関係は、既定クラス(車)と派生クラス(救急車、プリウス)というクラスの継承を説明する際に、よく使われる例えと同じ形式です。これはis_a関係と呼ばれます。 クラスの継承もオブジェクト指向の重要な概念なのに、これと混同する可能性が高く、その説明はあまり適切な説明ではないと感じるのですよ。(元の「アダム、イヴ、唐澤貴洋は人間である」と大差ありません。ただ量産できるものの例なので、A家のプリウス、B家のプリウス等の説明がやりやすいので助かりました。) なお、「先生が初心者へオブジェクト指向について解説している」という場面の話をしております。 繰り返しになりますが、実際のプログラミングの場面では、車としての特長を記録できれば十分な時にいちいち車classを継承して救急車class、プリウスclassを作るような設計はしません。不要な構造は省略した方がメンテナンス性が良いので、車classをコンストラクトして救急車instance、プリウスinstanceを生成するような設計をすることも もちろんあります。 あくまでも初心者に対して途中の説明を省いて一足飛びに説明するのは良くないという話なのです。
BeatStar

2019/03/21 01:54

Zuishinさんの >> たとえ話をする場合は「クラスは車です」で終わるのではなく、 は確かに。って思いますね。
guest

0

3つとも違う言い方だけど、3つを分けて考える事もないのかと。
3つを別々の流派と考えなくても、クラスベースのオブジェクト指向の説明として3つとも正しいと捉える事が出来ると思います。
(とは言っても、第1の流派に関しては間違いではないですがとても誤解を招きやすい説明の仕方です。第3の流派は私的には初心者にはタブーな部分まで触れてしまっている上に、説明の順番がごちゃごちゃです。第2の流派の説明の仕方が最も適切ではあると思います。)

なぜそんな事が言えるのかと言うと、日本語の「AはB」って言うのが「A∈B」「A⊆B」「A=B」のどの意味でも使われていて、かつ見分けがつきにくく、見分けがついたとしてもまた別の言い方が出来てしまいます。さらにオブジェクト指向の概念では、「AクラスはBクラスを継承している」「AオブジェクトはBクラスのオブジェクトである」と言う意味でも使われます。ややこしいですけどね。

a. 猫は生物
b. 猫は哺乳類
c. うちのタマは猫

この3つの主張を聞いて、3つの流派があるなんて思わないですよね。同じ人がこの3つの主張をしたところでどこも不自然じゃないです。でも、これらを聞いて「結局猫って何?」ってなるのも分かります。質問者様もちょうどそのような感じだと思います。

そこで、混同しないように「は」と言う助詞を使わず形式的にいろいろ言い表してみると、
(クラスは集合として考える事もできます。関数型言語等では型を集合として考えたりもします。ここではその考えに法って考えます。)

定義

A⇨B ⇔ AクラスはBクラスを継承している
A⇀B ⇔ AはBクラスのオブジェクトである

  • 猫 ⊆ 生物
  • 猫 ⊆ 哺乳類
  • うちのタマ ∈ 猫
  • 人間クラス ∈ クラス
  • 人間 ⇨ オブジェクト
  • 唐澤貴洋 ⇀ 人間
  • 唐澤貴洋 ⇀ オブジェクト
  • オブジェクトクラス ∈ クラス
  • オブジェクト = ????(クラス)
  • クラス ⊆ ????(オブジェクト)

って感じになると思います。
どれをとっても「"左項" は "右項" である。」と言い表せます。(ちゃんとやるなら哺乳類・人間・唐澤貴洋等の同値関係について定義が必要です。)
「⇨」と「⊆」、「⇀」と「∈」はそれぞれ似た様な意味合いです。
最後の2つは少しだけ集合論の知識が必要ですが、それぞれ「オブジェクトとは、クラスの合併集合」「クラスはオブジェクトの冪集合の部分集合」と言う意味で、クラスベースのオブジェクト指向を理解する上で最も重要だと私は考えています。

Javaとかだとクラスクラスってのがあって、クラスはオブジェクトだとしていますが、これはクラスベースのオブジェクト指向に対して共通の概念ではなく、それこそ一つの流派っていう感じだと思います。この流派に従えば、上記に加え、

  • 人間 ⇀ オブジェクト
  • クラス ⇨ オブジェクト
  • オブジェクト ⇀ オブジェクト
  • クラス ∈ クラス

みたいのも成り立ってしまうって事になります。ちなみに第3の流派はこれに従った説明です。

「a∈a」の形は自己言及と呼ばれる論理で、理解するのに苦労する上に矛盾を引き起こしやすいから数学界では忌み嫌われているらしいですが、この論理自体が直ちに矛盾を生じさせる訳ではないので、上記のものと矛盾なく両立できこの流派もきちんと成り立っています。

インスタンスに関しては、オブジェクトとあまり大きな違いはないと捉えてしまっても困ることはないと思います。メモリに確保されるのがインスタンスで、概念上の話をする時はオブジェクトと言う感じで使い分けるのが普通かなと思います。

投稿2019/06/09 22:07

編集2019/06/10 09:01
mightyMask

総合スコア143

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

Zuishin

2019/06/10 00:40 編集

> 猫 ⊆ 生物 猫は生物の真部分集合です。 > 猫 ⊆ 哺乳類 猫は哺乳類の真部分集合です。 > うちのタマ ∈ 猫 タマを知りませんが、これは合っていると思います。 > 人間 ∈ クラス 人間は集合です。 クラスが意味不明です。 > 人間 ⊆ オブジェクト オブジェクトが意味不明です。 > 唐澤貴洋 ∈ 人間 唐澤貴洋を知りませんがこれは合っていると思います。 > オブジェクト ∈ クラス 違います。 > オブジェクト=????(クラス) 違います。 > クラス ⊆ ????(オブジェクト) 違います。
mightyMask

2019/06/10 02:37 編集

猫が生物の真部分集合だから「猫 ⊆ 生物」が間違っているとでも? 人間が集合だから「人間 ∈ クラス」が間違っているとでも? 他のは否定する根拠は分かりませんが、この2つを見ればあなたの意見が集合論に基づいた意見ではないことは明白です。
Zuishin

2019/06/10 02:41

猫と生物が一致しないことは明白なので、より正確な表記が好ましいはずです。 「人間 ∈ クラス」に至っては話にもなりません。 人間はクラスの元ではありません。
Zuishin

2019/06/10 02:42

否定する根拠が書いていないものについては、肯定する根拠が全く不明だからです。何をもってその発想に至ったのかすらわかりません。
Zuishin

2019/06/10 02:44

人間がクラスの元であるなら、それが証明できるはずなので、まずはそれを証明してから反論してください。
swordone

2019/06/10 03:05

正確な表記かではなく、日時生活における「AはB」の意味の分類をしているんじゃないのか?真部分集合だから⊆が間違いって言うのはシビアに取り過ぎだと思う。
Zuishin

2019/06/10 03:07

日常生活で人間はクラスではないはずです。
swordone

2019/06/10 03:10

「人間 ∈ クラス」は、「人間クラス ∈ クラス」なら正しいと思う。「人間 ⊆ オブジェクト」は「人間の集合 ⊆ 全体集合としてのオブジェクト」ならはっきりするかな。
Zuishin

2019/06/10 03:13

「人間クラス」というのがこれまで全く出ていないので、まずそこからではないでしょうか。質問にあるのは「人間はオブジェクト」「人間はクラス」の二種類です。この回答で人間をホモサピエンスではなくクラスの名前とするなら、まずそこを明示しなければならないと思います。様々な概念が混同されている回答です。
Zuishin

2019/06/10 03:18

この回答に高評価が二つついていますが、どこが評価されているのか全く理解できません。何かがわかりやすくなりましたか? 結論も間違っているように思いますが、正しいですか?
mightyMask

2019/06/10 03:28

「猫 ⊆ 生物」自体は間違っていないと言う事ですね。 では誤解を生む様な表記に感じたのでしょうか? 私が「⊂」ではなく「⊆」を使ったのには3つ理由があり、 1. 部分集合か真部分集合かを区別したところで、理解の助けにはならないと判断したから。 2. 「⊂」より「⊆」の方が定義が単純なので、確認するのが簡単だと判断したから。 3. 助詞「は」に着目した文意で、普段の日本語では「は」は「⊂」と言うより「⊆」の方が近いニュアンスで使用していると私が感じているから。 と言う理由から「⊂」ではなく「⊆」を使って説明したのですが、それでも「⊂」の方が好ましいでしょうか?
mightyMask

2019/06/10 03:29 編集

以下は「人間 ∈ クラス」の証明の形を借りた根拠です。証明ではないですが。 任意のA,Bに対して、AはBクラスのオブジェクトである時、A ∈ B は一般に成り立ちます。...① 人間クラスはクラスクラスのオブジェクトです。 ...② ①,②より、人間クラス ∈ クラスが成り立ちます。
mightyMask

2019/06/10 03:31 編集

私は、Zuishinさんの 「人間が集合だから「人間 ∈ クラス」が間違っている」という様な言い方から「集合は集合の要素になれない」と勘違いされているのではないかと感じました。 意見が別れるのもこれが原因だと感じています。 それなら冪集合や合併集合そのものにに対し否定的な意見なのは分かりますが、集合は集合の要素になれると捉え考える事により冪集合や合併集合の有用性も共に見えてくると思います。 「集合族」でググれば、Zuishin さんの理解も深まると思います。
Zuishin

2019/06/10 03:37

つまり猫と生物は日常語の猫と生物ということですね? クラスの名前ではなく?
Zuishin

2019/06/10 03:38

そして人間は集合ということですね? クラスの名前ではなく?
Zuishin

2019/06/10 03:48

私は「人間は集合です」と書きました。それに対するあなたの反論は「人間は集合ではなくクラスの名前です」とあるべきですが、実際には「集合は集合の要素になれる」ときうものでした。 ここからあなたが「人間」を「集合」ととらえていることは明白で、そしてあなたが用語を混同していることも同時に明白になります。 これが「比喩を使ってはいけない」と皆さん方がおっしゃってる理由ですよ。あなたみたいなのが混同し、同一視してわけのわからないことを言い出すからです。 まずは言葉の定義をはっきりさせ、自分で学習を深めてください。自分の言ってることがむちゃくちゃだとわかれば少し賢くなったと言えるでしょう。
mightyMask

2019/06/10 04:03 編集

人間・人間の集合・人間クラスの違いについて、Zuishinさんのお二方に言及されていますが、 私は「AはB」を「A⊆B」と表しましたが、お二方の主張は「それは「A⊆Bの集合」と言うべきだ」とも言い換えられると思います。 「AはB」を「A⊆B」と表していると言うことは、「人間」と「人間の集合」は区別をつけなくて良いと言う事になります。私はそれで良いと解釈しています。さらに、「人間クラス」と言うのは「人間の集合」を文意を表すために言い換えているだけだと解釈しています。 そう解釈する事により、「AはB」と言うのを形式的に表す事ができ、曖昧な解釈をある程度排除できます。つまり比喩でもなければ用語を混同しているわけでもありません。 ちなみに、他の方は比喩を否定されていますが、私はそうは思っていません。上記の内容が比喩である事は否定しますが。下手な比喩を用いると返って混乱すると言うのには賛同です。 私は回答の中で日本語の解釈の仕方について説明するために猫の話で比喩を出しました。これは、下手な比喩だとも思っていないし理解の助けになるものだと思ってこの比喩を挙げました。
Zuishin

2019/06/10 04:07 編集

助けになっていませんね。自分の言っていることの意味がわかっていますか? また、オブジェクト指向初心者がこのように用語の定義が曖昧で混同された説明を読んで理解できると本当に考えていますか? まずは集合とは何かというところから理解を深められたらどうでしょう? 単一の派生クラスは集合ではありませんし、基本クラスの要素でもありません。 あなた自身が混同しており、説明を聞いても理解できないことから、比喩が害悪であることの証明を自らしています。
tamoto

2019/06/10 04:15

回答者さんへ。横からすみませんが、その「A」や「B」について、 *要素単体としてのA(オブジェクト) *要素Aの集まりとしてのA(集合) * A(集合)の各要素が持つ性質の定義としてのA(クラス) の3つを混同しています。これらのうち正しいもの同士じゃないと「AはB」という表現はそもそも成り立たない、という単純な指摘なんです。 これらの上に、「A(クラス)を要素として扱った場合のA(クラスクラスのインスタンス)」という一周回った話まで持ち込んでいるため、めちゃくちゃになってしまっています。
mightyMask

2019/06/10 04:17

>オブジェクト指向初心者がこのように用語の定義が曖昧で混同された説明を読んで理解できると本当に考えていますか? 私は用語を混同していない事を主張していますので、それを否定しない限り私が用語を混同している前提でしている話は意味がありません。 >まずは集合とは何かというところから理解を深められたらどうでしょう? 集合が集合の要素になれないと思っている Zuishin さんよりは確実に私の方が集合に対する理解は深いです。
Zuishin

2019/06/10 04:21

集合は集合の要素になれますよ。知ってます。以上ですか?
Zuishin

2019/06/10 04:29

以上であれば、今まで学んだことをよく自分なりに咀嚼して理解を深め、回答を書き直してください。
mightyMask

2019/06/10 04:29

> >人間 ∈ クラス > 人間は集合です。 > 私は「人間は集合です」と書きました。それに対するあなたの反論は「人間は集合ではなくクラスの名前です」とあるべきですが、実際には「集合は集合の要素になれる」ときうものでした。 この時点での Zuishin さんは集合は集合の要素にはなれないと考えていたはずです。 今知ったのか、気が変わったのかは分かりませんが。
mightyMask

2019/06/10 04:32

もう一度言いますが、私は用語を混同していない事を主張していますので、それを否定しない限り私が用語を混同している前提でしている話は意味がありません。
Zuishin

2019/06/10 04:34

おや? なぜそう思いましたか? 「クラスが何か意味不明」である中で「人間が集合」であるなら「クラス」が意味するものは生物としての人間を含む集合であるはずですね。それを指摘しただけですが。
Zuishin

2019/06/10 04:35

このような問いを発想する事自体が混同している証拠です。そしてあなたは自分が混同していることがまだわかっていません。理解を深めてください。
Zuishin

2019/06/10 04:43

混同していないのであれば次を証明してみてください。 > 人間 ∈ クラス ただし人間は集合とする
swordone

2019/06/10 04:45

私は個人的には集合論を使ったこの説明には賛同しますが、用語混同に関しても同意します。「人間」が所々でどの意味で使われているかが不明瞭、または変化しているのです。
mightyMask

2019/06/10 04:45

> 「人間が集合」であるなら「クラス」が意味するものは生物としての人間を含む集合であるはず その通りですがそれがどの様な指摘になっているのでしょうか。 人間が集合になる事がなぜ「人間 ∈ クラス」を否定する根拠になるのでしょうか。 「オブジェクト ∈ クラス 」「オブジェクト=????(クラス)」「クラス ⊆ ????(オブジェクト)」 これらを否定する根拠はなんでしょうか。
Zuishin

2019/06/10 04:48

> その通りですがそれがどの様な指摘になっているのでしょうか。 混同していることの指摘です。私を含め、少なくとも三人があなたが混同していると思っています。
mightyMask

2019/06/10 04:49

先ほども述べた通り、「人間」「人間の集合」「人間クラス」は一貫して区別をせず説明しています。 全て1つの同じ意味です。そう捉える事によって助詞「は」の曖昧な解釈をある程度排除できます。 人間 = 人間の集合 = 人間クラス が成り立つと矛盾が生じるでしょうか。
swordone

2019/06/10 04:52 編集

>> 「人間が集合」であるなら「クラス」が意味するものは生物としての人間を含む集合であるはず > その通りですがそれがどの様な指摘になっているのでしょうか。 えっ 違う違う。お互い頭冷やせ。 人間 ⊂ クラス だとしたら「クラスが生物全般」ってことになっておかしいけど、 人間 ∈ クラス の場合は「人間という集合が、ある『集合の集合』の一要素」ってことだからな?
mightyMask

2019/06/10 04:56 編集

swordone さん。 Zuishinさんが言う含むはおそらく「⊂」ではなく「∈」を示しているのだと思います。
swordone

2019/06/10 04:58

うん、だからmightyMaskさんの「その通り」はおかしい。
mightyMask

2019/06/10 05:08 編集

なるほど。それに関しては納得できました。 >「人間が集合」であるなら「クラス」が意味するものは生物としての人間を含む集合であるはず だと 人間∈集合 ⇒ クラス=人間 って事になりますね。 確かにこれはおかしいです。 なおさらどんな主張なのか分からなくなりましたが。
Zuishin

2019/06/10 05:29

おかしいことがわかりましたか?
Zuishin

2019/06/10 05:32

一番おかしいのは、クラスの役割です。クラスというのはプログラミング用語で、わかりやすく言うとオブジェクトのインスタンスを生成する設計図となるものです。 生物としての人間はプログラムではないので、人間クラスというものはありません。プログラミング上は人間クラスと名付けたクラスを作ることは可能ですが、そこから新たな人間を生み出すことはできません。
Zuishin

2019/06/10 05:38

その上でこれを見てください。 > 猫 ⊆ 生物 > 人間 ∈ クラス まだおかしく見えませんか?
Zuishin

2019/06/10 05:46 編集

クラスについて問われた質問で、このようにクラスもインスタンスもオブジェクトも猫も人間もみなごちゃ混ぜにした回答で、何もおかしいと思いませんか? 最後の結論など「オブジェクトとインスタンスは同じ」となっています。その上でヒープがどうこうという意味不明な線引きがされています。 あなたが自分をどう評価しているのか知りませんが、混同しているのは間違いないのでよく調べ直して回答を書き直してください。
mightyMask

2019/06/10 05:48

本回答は多少修正しましたがどうでしょうか。 私の意見が変わったわけではありませんが、本回答はなるべく多くの人が賛同できるものの方が良いという思いからです。 猫 ⊆ 生物 の部分は、クラスの話ではなく、助詞「は」が「⊆」と言う意味でも使われている事を表しているのですが。
Zuishin

2019/06/10 05:56

修正ありがとうございます。ただ私は評価を上げるに至りませんでした。理由はすでに述べたものばかりなので割愛します。
swordone

2019/06/10 05:56

インスタンスはオブジェクト… インスタンス ⊂ オブジェクト で、何ら問題ないと思いますが。
mightyMask

2019/06/10 05:59 編集

ヒープに取られると言うのはつまり、プログラムを書いて内部でどう扱われるのかと言う話で、オブジェクトと言うのは概念上でと言う事です。 プログラム上での人間クラスと私が言っている人間クラスと言うのは別です。 質問者の質問での人間と言うのは明らかに後者のものでしょう。 人間クラスというのを質問者の意図に合わせて回答したらプログラム上の人間クラスとは別の概念上の人間クラスと言う事になるでしょう。 ここでは概念上の話をしているはずなので、私はインスタンスと言う言葉を使っていませんでしたが。
swordone

2019/06/10 06:00

> 一番おかしいのは、クラスの役割です。クラスというのはプログラミング用語で、わかりやすく言うとオブジェクトのインスタンスを生成する設計図となるものです。 それはそれで確かに正しいのですが、見方を変えれば「集合の定義」ととることもできると思いますよ。クラス名はその集合に付けた名前ということで。 もっとも、全く同じ内容のクラスを別名で定義すると別のクラスになってしまうので、厳密に集合の定義とは言えないのですが…
mightyMask

2019/06/10 06:12

評価は私にとってはどうでも良いですが、できれば他に納得いかない点があれば教えて欲しいです。 私が妥協できると判断すればまた修正します。 特に 「タマ ∈ 猫」と「猫 ⊆ 生物」の部分なのですが、これもまだおかしいと感じるでしょうか。 「タマは猫である」を言い換えれば「タマは猫の集合の要素である」だと思いますし、 「猫は生物である」を言い換えれば「猫の集合は生物の集合の部分集合である」だと思います。 これを我々が普段から無意識に使っていると言う事は、「猫」を「猫の集合」だと普段から考えているのだと考えています。 だから「猫の集合 ⊆ 生物の集合」は「猫 ⊆ 生物」と表してしまっても問題がないのだと考えているのです。そして、後者で表した方が「「AはB」って言うのが「A∈B」「A⊆B」「A=B」と表される」事を説明するのに適していると考えています。
Zuishin

2019/06/10 06:17

補足します。 > インスタンスに関しては、オブジェクトと全く同じものと捉えてしまっても困ることはないと思います。ヒープ領域に確保されるのがインスタンスで、概念上の話をする時はオブジェクトと言う感じで使い分けるのが普通かなと思います。 全く同じではないですね。インスタンスも概念上の名称で、実装には依存していません。ヒープにあろうが、スタックにあろうが、メモリを占有していなかろうが、インスタンスはインスタンスです。 オブジェクトはインスタンスよりももっと広い概念で、個々のインスタンスが無くてもオブジェクトになり得ます。 インスタンスはクラスに対応し、クラスとの関連性で定義されるものですから、たとえばクラスメソッドとインスタンスメソッドという分類があったとき、その両方がオブジェクトになり得ます。 この時、「インスタンス=オブジェクト」という認識であれば、混乱をきたすでしょう。二種類の単語が全く同じ意味なのであれば、どちらか一種類でいいはずです。
mightyMask

2019/06/10 06:22

>全く同じ内容のクラスを別名で定義すると別のクラスになってしまうので、厳密に集合の定義とは言えないのですが… 確かに言われてみればその通りですね。集合は名前とか関係なく中身だけを比較しますが、クラスは名前が違えば違うクラスです。 「クラス ⊆ 集合」が間違っていると言うのはこれで納得できました。 しかし私が混同していると指摘されているのはそこではないと思うので私の考え方は変わらずですが。
Zuishin

2019/06/10 06:24

クラスを集合ととらえる考え方はありだと思います。 問題はクラスとインスタンス、そして比喩を混同しているというところです。集合の要素が派生クラスなのかインスタンスなのか生物なのかわからなくなります。少なくとも初心者向けの説明では誤解を招くと思います。
mightyMask

2019/06/10 06:53

インスタンスに関して多少の修正を加えました。 > 問題はクラスとインスタンス、そして比喩を混同しているというところです。集合の要素が派生クラスなのかインスタンスなのか生物なのかわからなくなります。 どの辺りの記述が混同していますか? 派生クラスもインスタンスも生物(の集合)も何らかの集合の要素である事はありますよね。
mightyMask

2019/06/10 07:22

猫 ⊆ 生物 人間 ⊆ オブジェクト 私がこれが成り立っていると考えるのは、私が混同しているからだとお考えですか?
Zuishin

2019/06/10 07:42

そうですね。人間はオブジェクトではないので。
tamoto

2019/06/10 07:54

クラスを単なる集合の一つとみなしているのであれば、間違ってはいないと思います。人間オブジェクトの集合はオブジェクト集合の部分集合になるという表現は正しいです。 インスタンスについての説明はちょっと疑問があります。クラスを集合とみなすならオブジェクトと全く同一ですし、そうでないなら別の概念です。
mightyMask

2019/06/10 08:20

Zuishinさん ①「人間」=「人間の集合」 ②「人間の集合」=「人間クラス」(と考えても良い) ③「人間」=「人間クラス」⇒「オブジェクト」=「オブジェクトクラス」 ④「人間クラス」⊆「オブジェクトクラス」 ⑤ ①~④が成り立つ ⇒「人間 ⊆ オブジェクト」 ①~⑤が全て正しいなら「人間 ⊆ オブジェクト」は示せますよね。 私は全て正しいとしてここまで議論してきましたが、この中で成り立たない命題はいくつありますか? そして、私の混同がその勘違いにどう影響していますか?
mightyMask

2019/06/10 08:21

tamotoさん 私もそう思います。 tamotoさんも私の回答が混同していると仰っていましたが、クラスを集合としてみなしていると言う前提があってもそう思いますか?
tamoto

2019/06/10 08:27

当初の回答では単一要素(オブジェクト)とクラスの区別が曖昧と感じられたための指摘でしたが、現時点のものでは問題ないと思います。(現状でも、暗黙的に集合を指しているものも(集合)とちゃんと明記してあったほうがより良いだろうとは思っています)
Zuishin

2019/06/10 08:33

すべて正しいならプログラムで人間を作ってみてください。私はそれは人間ではないと思います。人間の集合は人間クラスではありません。クラスはプログラミング用語です。
mightyMask

2019/06/10 08:39 編集

tamotoさん 当初の回答ですと、今の回答と違うのは、 人間 ∈ クラス 人間 ⊆ オブジェクト 唐澤貴洋 ∈ 人間 オブジェクト ∈ クラス 人間 ∈ オブジェクト クラス ⊆ オブジェクト 等がありますが、曖昧とはここらの事でしょうか? 但し書きは追記しておきます。
mightyMask

2019/06/10 08:55 編集

Zuishinさん クラスがオブジェクトを作ると言うのはそれこそ比喩なのではないですか? プログラム上ではオブジェクトを作っているのはCPUですよね。 ②を否定しているようですが、②は本当は正しくないのに私の混同が原因で②が成立すると勘違いしていると言う事ですよね。 混同が勘違いにどう影響しているんですか? > クラスを集合ととらえる考え方はありだと思います。 それは人間の集合と人間クラスを同一視するのとはどう違うのですか? 質問は以上3つです。
tamoto

2019/06/10 09:01

(クラスを要素とみなしてその集合の中の)人間「クラス」、 (オブジェクト集合の中の)人間「オブジェクトの集合」、 という2種類の要素を単に「人間」と表記していたため、これがオブジェクトとしての「人間」と混同され、おかしく読み取れます。 クラス ⊆ オブジェクト も「オブジェクト集合の中にクラスの集合がある」と読んでしまうと全く意味不明です。 これらの記述から、「概念を混同しているのではないか」という疑惑の元で回答を読むことになったため、現状の議論に発展したのだと思います。 個人的には、前者にある「人間クラス」と「人間オブジェクトの集合」を、「クラスを集合である」とみなして同一視することには無理があると思っています。一方は性質を定義するレイヤ上の概念であり、もう一方は「実体の集まり」を指していると考えられるからです。
Zuishin

2019/06/10 09:11

どう説明したらいいんだろう。何がわからないのかわからない。 一度人間をプログラミングしてみたらわかるんじゃないですか?
mightyMask

2019/06/10 09:15

> 一方は性質を定義するレイヤ上の概念であり、もう一方は「実体の集まり」を指している それを集合の内包表記と捉える事はできないでしょうか。 実体の集まりを定義するのに、それらの実体だけが持つ性質を書き下して集合を表すのが内包表記ですよね。
Zuishin

2019/06/10 09:25 編集

人間がプログラミングできないとしたら、その命題は破綻しますよね。 論理の中にありえない比喩をぶち込んでるからです。 ポチは犬である 犬は餅である ゆえにポチは餅である みたいな つまり、比喩で出した人間とクラスの名前である人間がたまたま同じ名前、というよりわざわざそう命名したんですが、同じ名前であったために、二つの区別がつかなくなってぐちゃぐちゃになってるからです。比喩を持ち出すことによって、わかりやすいことをわざわざわかりにくくして自ら混乱しているわけです。 クラスはクラス、インスタンスはインスタンス、人間は人間、人間クラスは人間クラス、これらの区別がつかなくてはいけません。 人間と人間クラスを削除して、クラスとインスタンスの話だけ比喩を使わずにしてみたらわかりやすくなるんじゃないですか? 人間と人間クラスを削除できないとしたら、論理の中にそれがガッチガチに食い込んでるのでおかしなことになっていることに気づくかもしれません。
Zuishin

2019/06/10 09:26

もちろん人間だけでなく猫も削除するんですよ。犬でも同じです。
mightyMask

2019/06/10 09:27

> 一度人間をプログラミングしてみたらわかるんじゃないですか? 煽り文句はスルーして来ましたが、2度同じ煽りを入れられたのでこれにはレスポンスしておきます。 この文が本気で思ってるわけではないのは分かっています。 私は人間ですが、「私∈人間」なのであって、「私=人間」ではありません。なので私はクラスではありません。なので私はクラスではないので人間を作れません。 仮に私がクラスだったとして、それでもクラスがオブジェクトを作ると言うのは比喩なので出来ません。 > どう説明したらいいんだろう。何がわからないのかわからない。 それは私の質問によってあなたの主張の整合性が取れなくなって困った、あるいは自分の心のどこかで自分が間違っていたと気づいているから、相手が分からないのが悪いのだと自己暗示をかけているのです。
Zuishin

2019/06/10 09:28

すごいな。本気でわからないんだこの人。困ったな。
Zuishin

2019/06/10 09:29

比喩なのでできない、まで気づいたら 比喩なので本当ではない、まで気づきそうなもんだけどふつう。
Zuishin

2019/06/10 09:39

定義 A⇀B ⇔ AはBクラスのオブジェクトである 唐澤貴洋 ⇀ 人間 唐澤貴洋 ⇀ オブジェクト これ本気で言ってるんですよね? 何かの間違いじゃなくて?
Zuishin

2019/06/10 09:40

唐澤貴洋は人間クラスのオブジェクトであり、またオブジェクトクラスのオブジェクトである というあなたの主張になるわけですが、唐澤貴洋はプログラミングで生み出すことできませんよね? だから、間違ってます。
mightyMask

2019/06/10 09:49

比喩である事は認めるのですね。比喩を使ってはいけないと散々仰られていたのに整合性が取れていません。矛盾しています。実際はクラスがオブジェクトを作っているわけでは無いですから。 本当ではないの主語は「あなたの主張」ですね。あなたが例えた比喩であなたがこれ出来るの?と言った話なのですから。 猫 ⊆ 生物 を最初は肯定しておきながら、後からこれおかしい事に気づかないの?と否定するのも整合性が取れていません。 > 人間が集合になる事がなぜ「人間 ∈ クラス」を否定する根拠になるのでしょうか。 > 人間 = 人間の集合 = 人間クラス が成り立つと矛盾が生じるでしょうか。 > クラスがオブジェクトを作ると言うのはそれこそ比喩なのではないですか? 等の質問にあなたが答えられないのも、どう答えようとも整合性が取れないからです。 整合性が取れないから困った。でも自分が間違ってる訳が無い。相手が分からないのが悪いのだ。 これがあなたの思考です。
Zuishin

2019/06/10 09:51 編集

あなたが比喩を使っているために整合性が取れずあなたは混乱しているようです。だから使ってはいけません。
Zuishin

2019/06/10 09:51

これでわかりますか?
arasi

2019/06/10 09:51

実在する他人の名前を使ってやり取りするのはここでやってはダメでしょう
mightyMask

2019/06/10 09:55

人の名前はこれ以上出さないでおきましょうか。
Zuishin

2019/06/10 09:59

そもそもの質問は明快です。 「オブジェクトとは何ですか?」 それに対するあなたの答えは「人間は生物で猫は生物で集合論でクラスでインスタンスで、でもこのクラスは集合のことでプログラミングのクラスと同じで」という意味不明で無関係で間違っている論理を述べた後、「メモリに確保されるのがインスタンスで、概念上の話をする時はオブジェクトと言う感じで使い分ける」と結論付けています。 大間違いです。 一度書きましたが、インスタンスは概念です。 メモリ上にあるとも限りません。 インスタンスはクラスの対としてあるもので、オブジェクトはインスタンスよりも広い概念ですが、どちらも概念です。
Zuishin

2019/06/10 10:01

メモリ上にあるかどうかで言えば、オブジェクトもメモリ上にあることが多いわけですから、ここをもってインスタンスと区別することはできません。
mightyMask

2019/06/10 10:01

煽り合いになるだけなので、ここでこれ以上とっかかるのはやめておきます。結論は出ないですが。 まだ話を続けられるなら他の掲示板を教えてください。
Zuishin

2019/06/10 10:03

結論は出ています。あなたが理解できるかどうかは別の話ですが。
guest

0

Object 型

JavaScriptにおいては、オブジェクトとはObject 型の事です。
そして、「クラス」も「インスタンス」も Object 型です。

「例え話」に正解はありません。
正確を期すならば、コードで説明しましょう。

未解決の質問

未解決の質問を一つずつ解決してから、次の質問をしてください。
問題が分からない状態で次の課題に取り組むのは、曖昧な知識の上に曖昧な知識を重ねるだけなので、せっかくの回答も頭に入りません。

Re: WeilSpinor さん

投稿2019/03/17 02:58

編集2019/03/17 02:59
think49

総合スコア18162

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

0

オブジェクト指向は、そのオブジェクト指向プログラミング言語によって解釈が異なっています。そのため言語ごとに異なります。オブジェクト指向の話題がでた場合、どの言語でのオブジェクト指向かということを確認する必要があります。多くの場合Java言語のオブジェクト指向(クラスベースのオブジェクト指向)のことを指していることが多いです

また、C言語のような、非オブジェクト指向言語の場合独自にオブジェクト指向を実装することになるため、実装方法によって異なります。

さてJava等のクラスベースのオブジェクト指向では、クラスは設計図または鋳型、オブジェクトは実体のため第二の流派ということになります。

JavaScriptについてはすでに回答がありますのでそちらを参照してください。

投稿2019/03/17 03:32

fu7mu4

総合スコア1088

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

0

例題でコードがないと関係性が見えないところはありますが「人間」を「クラス」としている場合はあくまで親クラス、または抽象クラスとして直接参照されることはなくて、実際にインスタンス化させて操作するのは人間クラスを継承させた各クラスのような作りになっているのではないでしょうか。
例示の流派とされてる表現はおおよそどの表現を用いても通じそうには思います。

投稿2019/03/17 02:52

m.ts10806

総合スコア80850

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

0

わたしも te2jiさんに同意。

オブジェクト指向ってのが素晴らしいっていうより、考え方です。

参考: 参考1

で、どっちがどっちだったか忘れましたが、サブセットだった気がします。

オブジェクト ⊆ インスタンス

だったか、逆だったかもしれませんが、大体同じ意味で使っていることが多いです。

私の経験(趣味)では

オブジェクト : クラス + インスタンス
インスタンス : クラスから生成したもの

って感じでしょうか。ただ、ほとんどの文脈では object = instance と大差ないことが多いです。

多分、質問の例では "人間" クラスから生成した "アダム", "イブ", "唐澤貴洋" (どちらさん?) という感じになっているはず。

C++で書くと、

C++

1// std::wstring は Javaだと Stringのようなもの。 2// ただし、wchar_t と呼ばれる、ワイド文字列用。 3class Human{ 4 public: 5 Human( const std::wstring &name ) : name_(name){} 6 ~Human(){} 7 std::wstring introduce( void ){ /* ここで自己紹介風で印字 */ } 8 private: 9 std::wstring name_; 10}; 11 12// ここからはmain関数のような呼び出し側だとして 13Human adam( L"アダム" ); 14Human eve( L"イブ" ); 15Human karasawa( L"唐澤貴洋" ); 16adam.introduce(); 17eve.introduce(); 18karasawa.introduce();

のような感じだと思う。

ただ、te2jiさんがおっしゃるように、例え話で説明するのはダメだと思う。

わかったような、わからないような...って感じ。

むしろ、歴史・背景なんかや、「オブジェクト指向じゃない場合とオブジェクト指向の場合ではこんな差がある」という実例を提示したほうがまだわかりやすいかも。


[追記1]

プログラミング初心者なのに生意気を言ってしまい...

いえ、初心者かどうかなんて関係ないです。
意味のある議論なら初心者でもすべきです。
ですが、私が最初に言いたかったものは、

『初心者が勘違いする人が出てくる』

ということです。

確かに、OOPをある程度理解したうえでたとえ話を読むと納得できます。
しかし、初心者には...ちょっと...ね?

私自身の話をすると、
動物クラスを作って、継承していぬクラス、猫クラス...
『ん? で、何がいいんだ?』
っていう風な感じでした。

現実世界のモデリングはできるのでしょうけど、大体の初心者は「これを使って何ができて、何ができないか」を見ています。後は「存在意義」。

しかもそのサイトの書き方が変。

C++

1class Animal{ 2 public: 3 Animal(){} 4 virtual ~Animal(){} 5 void bark( void ){} 6 void eat( void ){} 7 void sleep( void ){} 8}; 9 10class Dog : public Animal{ 11 public: 12 Dog( const std::string &name ) : name_(name){} 13 virtual ~Dog(){} 14 void bark( void ){ cout << "わんわん" << endl; } 15 void eat( void ){ /* 食事中 */ } 16 void sleep( void ){ /* 寝ている... */ } 17 private: 18 std::string name_; 19}; 20 21class Cat : public Animal{ 22 public: 23 Cat( const std::string &name ) : name_(name){} 24 virtual ~Cat(){} 25 void bark( void ){ cout << "にゃー" << endl; } 26 void eat( void ){ /* 食事中 */ } 27 void sleep( void ){ /* 寝ている... */ } 28 private: 29 std::string name_; 30};

みたいに書いておきながら、

呼び出し元は、

C++

1Dog pochi( "ぽち" ); 2Cat tama( "たま" ); 3pochi.bark(); 4tama.bark();

ってやっているのが多い。

それだったら

C++

1Animal *pochi = new Dog( "ぽち" ); 2Animal *tama = new Cat( "たま" ); 3pochi.bark(); 4tama.bark();

っていう風に、「親として保持して、親として動かすときはどのオブジェクトでもできるよ。処理内容はオブジェクト自身が理解していればいいんだよ。
みたいに書いてあるならまだわかる。

ただドヤ顔で「ほれ見ろ。すごいだろぉ!」って言わんばかりのショーもない例が多い。

だったら中途半端な例よりは歴史背景やそれ以外の説明のほうがわかりやすい...っていう意味で最初に書いたのですが...

ただ、「この例え話だけが唯一の解釈ではない」ということは頭の片隅に置いておくべきだと、自分に言い聞かせています。

確かに。でも初心者はそれどころではないです。
というか、「丸投げして何が悪い」と逆ギレする人まで出る始末だし。

...ん? 私の(本質問に対する)解釈、間違ってます?

投稿2019/03/17 03:45

編集2019/03/21 01:51
BeatStar

総合スコア4958

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

WeilSpinor

2019/03/19 21:04 編集

ご回答ありがとうございます。 まず、もしかしたら、生意気なことを言ってしまうかもしれないことを先にお詫び申し上げておきます。 例え話は破綻する、というのはよく分かります。 でも、例え話というのは、物の理解の一つの手助けとして、なかなか避けられないものではないか、と思っています。 多分『オブジェクト指向』というものについても、「洗練された標準理論」と照らし合わせれば、 私が質問文で挙げた例え話は「ある意味正しい」「ある意味ちょっと違う」ということになると思います。 ただ、「この例え話だけが唯一の解釈ではない」ということは頭の片隅に置いておくべきだと、自分に言い聞かせています。 「正しい理解が重要」とのことですが、 思考回路は人それぞれ全然違う以上、物事の理解の仕方は人それぞれなので、『正しい理解』という概念自体存在しうるのか、ということになると思います。 もちろん、例えば『オブジェクト指向』というものを提唱した人物がただ1人いるならば、その人に直接聞けば絶対的な『正しい理解』が得られるかもしれませんが、果たしてその人の中の絶対的定義に意味があるのだろうか?、とも思います。 分野問わず、絶対的定義の存在するものって、実はあまりないと思っていて、それはシステムエンジニアリングの世界においても例外ではないんじゃないかと思います。 もちろん、エンジニア同士できちんとコミュニケーションを取りながら開発していくことができる程度には「理解のすり寄せ」「標準的な体型知識の共有」というものは必要ですが、 『コミュニケーション』というものは、実は「コミュニケーションが取れているように”当人たちが感じられる”こと」に他ならないので、さほどこだわる必要はないそうです。 (ウィトゲンシュタインという哲学者曰く、『コミュニケーション』という営みの定義はそれでしか不可能、だそうです) ですから、例えばエンジニアリングの現場だったら、 とりあえず動くものを作れて、それがどういう仕組みで動いているかの説明を共有できれば、御の字、 もちろん、体系的知識の理解の仕方や思想の違いは、 書き方の違い、設計のやり方の違い等に出てくるかもしれませんが… プログラミング初心者なのに生意気を言ってしまい、大変申し訳ありません。
BeatStar

2019/03/21 01:29

ちょっと本文に追加しますね。 (書きにくい...)
guest

0

あくまで私の学んだ考え方ですが…。
質問者さんの例えに沿うならば、「クラス」は「人間」で、「オブジェクト」は「アダム」や「イブ」、
「インスタンス」は「オブジェクト」の別名です。

人間には、名前、性別、年齢、身長、体重などの、データがありますよね。
それを「人間」クラスの中に入れるんです。
Javaで表現するならこうなります。

Java

1class Human { 2 String name; // 名前が入ります。 3 String sex; // 性別が入ります。 4 int age; // 年齢が入ります。 5 double height; // 身長が入ります。 6 double weight; // 体重が入ります。 7}

そして、この中に、アダムならばアダムの、イブならイブのデータを入れて使用します。
また、オブジェクト指向言語では、クラスの中にメソッド(関数)を入れることができます。

投稿2019/03/17 03:39

nobadag

総合スコア37

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

0

オブジェクトは, 「塊」
クラスは, 「構造(を成す塊)」
インスタンスは, 「構造に沿って作られた塊」

といったイメージでは如何でしょうか.

投稿2019/03/17 03:06

編集2019/03/17 03:08
jimbe

総合スコア12646

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

Zuishin

2019/03/17 03:19

オブジェクトは, 「トトロ」 クラスは, 「構造(を成すトトロ)」 インスタンスは, 「構造に沿って作られたトトロ」ではどうでしょう?
jimbe

2019/03/17 03:21

「塊」を固有名詞にしてしまうとイメージが崩れそうですが^^;
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.48%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問