トップページ⇒tech
1001コメント369KB

貴様ら!オブジェクト指向を教えろ!!

■ このスレッドは過去ログ倉庫に格納されています
0001Java太郎NGNG
理解してるんだったら、教えやがれ!!
0152Java太郎 ◆DMVtSSFzcg NGNG
>>150
わかってないな!おまえ・・・
一番キモイのはオレだ!!
ポリモルフィズムの利点がよくわからない、今日この頃ヾ(´ー` )ノ
0153デフォルトの名無しさんNGNG
JAVAの場合、Runnableとか見れば多少の利便性は解るだろうに。
Threadクラスの作成者はJAVAのプログラマがどんなクラスを実装
するのか知る事はできない。
だが、Runnableというインターフェースを定義しておく事で
ユーザの任意の元、未知のクラスにrun()というメソッドが
実装される事が保障され、Threadクラスから呼び出す事ができる。
0154デフォルトの名無しさんNGNG
>ラーメンクラスと、interfaceと、その他の追加するクラス関係が分かれば
>納得すると思う。できれば図キボンヌ。

interface 文字出力{
  void StrOut( String a );
}

class 画面クラス implements 文字出力
class プリンタクラス implements 文字出力
class 音声クラス implements 文字出力
であれば、

ラーメンタイマーは文字出力のクラス変数 tmpOut を持つことができる。
文字出力 tmpOut;

tmpOut の実態のクラスが何であるかにかかわらず
     tmpOut.StrOut("お時間がきました");
というメソッドが使える。
もちろんtmpOut変数にはセレクタから、実体を渡されて代入されている必要がある。
ラーメンタイマーが出力先の実体クラスを知る必要はない。
便利である。
0155デフォルトの名無しさんNGNG
ダメポ銀行のA嬢

A嬢は、ダメポ銀行に入行して2年目、窓口業務もかなり板についてきた。
実はA嬢はひそかにファンドマネージャになりたいと思って、
自己研鑽を重ねている。その成果が現れたのか、最近では
先輩社員がいろいろと相談を持ちかけてくれる。
上司も見る目も変わってきたようだ。
でも、まだまだ配置換えは期待できそうにない。
内心歯がゆい思いをしながら、今日も窓口に座る。
一旦窓口に座れば、窓口業務をこなさなくてはならない。
その時間はA嬢は、お客さまと銀行を取り持つ窓口係という、
大切なインタフェースの役割を果たしている。
0156デフォルトの名無しさんNGNG
>>153
初心者にスレの話しても混乱するだけと思われ
0157デフォルトの名無しさんNGNG
コンストラクタに自分の上位インタフェース渡すパターンって何?
0158デフォルトの名無しさんNGNG
天気いいなぁ・・・
0159デフォルトの名無しさんNGNG
なんですかラーメンタイマーって。
じゃあ俺もぽりもーひずむの利点を麺にちなんで例えてみる。

俺は製麺工場の技術主任。
架空の製麺機をプログラミングで作ってみたい。

工場ではうどん、蕎麦、ラーメンの3種を製造してる。
作る過程や材料は全部てんでバラバラ。共通性は殆ど無し。
共通していることといえば、麺を作るという事だけ。

という事で俺はまず製麺interfaceなるものを定義してみた。
これはJAVAでいうところのinterfaceですな。
メソッドはひとつ、製麺ボタン()を定義したのみ。
定義したといっても、製麺interface自体は空っぽ、
実体は無い。何の製麺機かすらも決まってない。

つづく
0160デフォルトの名無しさんNGNG
> 製麺ボタン()を定義したのみ。
> 製麺interface自体は空っぽ

定義したのか、空っぽなのか、どっちやねん。
それに、メソッド名が名詞てなんやねん。

0161デフォルトの名無しさんNGNG
>>159の続き

じゃ、そろそろ、うどん製麺機、蕎麦製麺機、
ラーメン製麺機を作ってみますか。。
ここで俺は当初の予定通り、製麺機を実装するにあたって、
それぞれの製麺機に"製麺interface"をインプリする事にした。
それって具体的にはどういう事か?
それぞれの製麺機は全く異なる機械で、内部動作や外見は異なるんだが
どの機械にも同じように製麺ボタン()を実装する、という事だ。
どの製麺機もこの製麺ボタン()さえ押せば、材料を加工して麺が
できあがるされる事が保障される。これだけ。
でも中でやってる事はとっても複雑なんだけどね。

つづく
0162Java太郎 ◆DMVtSSFzcg NGNG
定義して空っぽって
抽象メソッドみたいだね。

HAS-A関係(?)を使って
擬似的に多重継承できないのかな?
0163デフォルトの名無しさんNGNG
>>161の続き

工場の生産ラインには常時青鼻を垂らしてるバイト君が働いている。
彼には入社時に製麺インターフェースの操作方法だけ教え込んだ。
彼のできる事といえば、製麺インターフェースを実装してある
3つの製麺機を目の前にして、ひたすら製麺ボタン()を押すのみ。
彼は頭が足りないので、麺がどのような工程で作られている
のかを知らない、というか、それ以前に目の前の製麺機が何の
製麺機なのかすら知らない。。いや、知る必要すらないのだ。
何故なら何の製麺機であろうと、製麺ボタン()さえ押せれば
麺が出来上がるのだから。。

つづく
0164デフォルトの名無しさんNGNG
>>163のつづき

工場の生産ラインは順調だ。
バイト君の目前に製麺interfaceを実装した製麺機を置いてやれば、
それが何の製麺機であろうと、彼は麺を見事に作り上げていく。
近々、新商品としてスパゲッティを新たに手がける予定だ。
当然パスタ製麺機も製麺インターフェースをインプリした
機械にする予定なので、新たにバイトを増やす必要も無く、
既存のバイト君に新たな教育をする手間もかからないだろう。
0165デフォルトの名無しさんNGNG
話をややこしくするだけの人ってたまにいるね。
プロジェクトに入ってくるととても迷惑。
0166デフォルトの名無しさんNGNG
いいたいことはわかるのだけどね。

あらかじめ言いたいことが分かってる私には、なんでもないけれど、
分かってる人だけにわかればいい文章なんて、ここに書く意味ないし、
分かってない人に分かってもらうには、あまりにも不親切な誤りを含んでいる。
0167デフォルトの名無しさんNGNG
>不親切な誤りを

向学のため、指摘していただけると有りがたい。
0168デフォルトの名無しさんNGNG
>>106 で指摘したけれど、

中身が空っぽの interface
と
中身が空っぽの method
の違いをキチンと理解、区別しようね。
0169デフォルトの名無しさんNGNG
それは機械として中身は空っぽという事を言ったつもりなんだけど。
機械に例えたりプログラムに例えたりと
曖昧な例え方がいけなかったかな?
0170デフォルトの名無しさんNGNG
機械として中身が空っぽであるなら、ボタンなんてものも無い、と
読むのが普通ではないかい?

まあ、単なる比喩を元に突っ込んだ議論をしてもあまり意味がないと
思うけどさ。曖昧な例え方がいけないんじゃなく、日本語の記述に
無頓着なのがいけない気がする。
0171デフォルトの名無しさんNGNG
まあこのスレの趣向から言って
ポリィモーフィズムの雰囲気さえ
掴めれば問題ないんでない?
JAVAの話が主体じゃないんだし
0172デフォルトの名無しさんNGNG
>>170
悪かったよ。
もう余計な口は出さん事にするよ。
0173デフォルトの名無しさんNGNG
>>172

ありがとう。
ほんとうにそうたのむよ。
0174デフォルトの名無しさんNGNG
>173
ご満悦そうだな(w
0175デフォルトの名無しさんNGNG
>>162
そういうのは多重継承とはいわんよ。
単に集約してるといえばいいのさ
0176Java太郎 ◆DMVtSSFzcg NGNG
>>175
あなた頭いいでしょ?
わかる!!わかるんだよ・・・オレには。

多重継承ではないと、後から気づきましたよ!
ハッハッハ、こりゃ一本取られましたなw

集約なんだ・・・勉強になりました。
0177デフォルトの名無しさんNGNG
C++と比べてJAVAはクラスの
多重継承ができない代わりか
どうか知らんけど、
implemetsというキーワード
を提供しているが、それによって
良くなった点と悪くなった点を
誰か挙げてくれないか?
0178デフォルトの名無しさんNGNG
>>177
implementsはクラスへのinterface実装専用。

悪くなった点 : ちょっと記述が長くなったという程度。
MixJuiceやRubyのようなモジュール分割がしにくい。

よくなった点 : クラス継承においてダイヤモンド継承によるメソッドやフィールドのバッティングの心配がなくなった。
インターフェースがインターフェースを継承する場合は、この問題は起こりうるので要注意。

実装の多重継承は混乱のもとといわれてきた。それをコンパイラが禁止することで
プロジェクトでこっそり実装の多重継承をするプログラミングをさせないことで
バッティング問題を解消できる。
0179デフォルトの名無しさんNGNG
でも綿密に管理されたコードだったとして、
バッティングの心配とかを抜きにすれば、
多重継承できない事でコーディング量が増えたり
不便になったという事は考えられるんでない?
0180デフォルトの名無しさんNGNG
ATLとか見るとな
0181デフォルトの名無しさんNGNG
>良くなった点と悪くなった点を誰か挙げてくれないか?

まあ、広域変数とgoto文もそうだけど、誰が使ったか、
影響があるのはどこかを完全に把握してれば問題は回避できるけど、
分からなくなったらグチャグチャになったら取替えしが
つかないってことだよね。
おれは予防のコストはあとから大変になることを考えれば十分に見合う気はする。
特に複数の人でプロジェクトを進める場合はね。
でも、このコスト感覚は人によって違うと思う。
0182デフォルトの名無しさんNGNG
>>179
実装の多重継承の危険性はソフトウェア工学の研究で実証済み
0183デフォルトの名無しさんNGNG
>>182
だから、危険か危険じゃないかは人によって違うだろ。
使う人間によっては便利にもなるし、危険にもなる。
そもそも、お前のように自分の観点でしか物を見れない
奴がいるから危険なんだよ、バーカ。
0184デフォルトの名無しさんNGNG
独りで書いて使うぶんにゃとても便利だろうな。
多人数が同時に書いたり使ったりだと大変だろう。
0185デフォルトの名無しさんNGNG
そもそも多重継承できない事で代替の方法でコーディング量が増えることは少ないわけだが。
逆に減ることもあるわけでな
0186デフォルトの名無しさんNGNG
CPPの多重継承の機能はJAVAの
interfaceでは完全に代替できない。
コードの再利用という観点からすれば
実装を継承できるのとできないとでは
やっぱ色々と違うでしょ
0187デフォルトの名無しさんNGNG
わからん・・・。
手続き型言語のサブルーチンじゃだめなの?
どこから呼び出しても使える便利なサブルーチンをたくさん作ってさ、あとはメインルーチンからどれをどう呼び出すかだけプログラムすればいいようにすれコーディングは十分ラクできるじゃん。
オブジェクト指向はさらに何をラクしたくてできた言語なわけ?
よくできたサブルーチン集を作ることとの決定的な違いってなによ?
0188デフォルトの名無しさんNGNG
よくできたサブルーチン集と、それが内部で使うデータを一塊にする

あと、オブジェクト指向は言語じゃない
0189デフォルトの名無しさんNGNG
>>187
コードの再利用とか不必要な情報の隠蔽とか利点はいろいろあると思う。
まあ特に必要を感じないんだったら従来どおりにやればいいと思うよ。
0190デフォルトの名無しさんNGNG
>>188
低能な突っ込みやめれ。
言いたいことは解るだろう?
0191デフォルトの名無しさんNGNG
モジュールとして完成度の高いプログラムはアセンブリ言語でも書くことが出来る。
したがって、オブジェクト指向型の言語は必須ではない。
しかし、オブジェクト指向型言語は、モジュールの完成度を高めるための支援を言語レベルで行う。
いわゆる勘違いによる間違いが減る。それだけである。が、これは圧倒的な生産性の向上を意味する。
よく出来たサブルーチンを作れる人ならば、オブジェクト指向の支援を便利に感じるであろう。
まずは良く出来たサブルーチンの条件、モジュール強度と
モジュール結合度などから学びはじめるのが良いだろう。
0192デフォルトの名無しさんNGNG
>いわゆる勘違いによる間違いが減る。それだけである。

それだけじゃないと思うが(w
0193デフォルトの名無しさんNGNG
オブジェクト指向の利点が理解できないひとは
もう無理にオブジェクト指向を理解しなくてもいいと思う
しょうがないよ、脳みその出来は個人差があるんだから
世の中にはポインタですら理解できない人もいるんだから
0194デフォルトの名無しさんNGNG
>>187
生産性。

OOPだと、ポリモーフィズムとか、色々融通が利く。サブルーチンではこうもすっきり
いかないで、引数の型違いとかの名前や内容が微妙に違う関数とかを作らなくては
ならないケースが出てしまい、それを使う側のコードもそれ用に書かなければならず、
その手間が面倒になり、結果、生産性が落ちる。

OOでは、インターフェースさえきちんと設計しておけば、メンテはめっちゃくちゃ楽。

・・・とかいいつつ、全然初心者だったりする儂。
0195デフォルトの名無しさんNGNG
>>193
短絡的な意見ありがとうございます。
0196デフォルトの名無しさんNGNG
オブジェクト指向によるコードが再利用できる程度が知れてます。
0197デフォルトの名無しさんNGNG
struct 男;
struct 女;

void 男絶頂(){}
void 女絶頂(){}

class 人間{
絶頂()
}
class 男:人間{}
class 女:人間{}

人間.絶頂()

手続きだと性別ごとに絶頂を呼び出さないとだめだが、オブジェクト指向でクラスをつかい継承すると絶頂が1つで済む。
0198デフォルトの名無しさんNGNG
>>187
構造化手法だけではカプセル化という概念を導入できない。

UMLかJavaの勉強をすればオブジェクト指向を素早く理解できる。

構造化手法だけでは各コンポーネント間の結合度を凝集度を下げることは
容易ではない。

各ソフトウェアコンポーネントは互いに低い結合度で結びつきあっていることが望ましい。
一つのコンポーネントは互いに関連のある責務だけから形成されていることが望ましい。

これが構造化手法の研究成果であるという。
0199デフォルトの名無しさんNGNG
ときに、人間クラスがあったとして、そこから男・女クラスが
派生しているとして、sex() はOO的にどこに実装されるのが
妥当ですか?
0200デフォルトの名無しさんNGNG
>>199
sexは名詞というの分かっているか?
0201199NGNG
ああ、では fuck (w でもいいですが。
0202デフォルトの名無しさんNGNG
Sexは一見動詞に、つまりメソッドであるように思えます。
しかし、この分析はよくある間違いです。
Sexは誰かが持っているものでもないし、何人でやる行為であるかさえ決まっていないからです。
Sexとは柔軟で複雑な関係のことを指す言葉です。
従って、関係を表すSexインターフェイスを作り、NomalSexオブジェクトを実装するかたちにしたほうが良いでしょう。
参加者はentryメソッドで集い、startメソッドで宴が始まるのです。
0203199NGNG
なるほどなるほど、至極納得であります>>202
0204デフォルトの名無しさんNGNG
男ばかりがエントリされたときはstart時にアブノーマル例外を送出
0205デフォルトの名無しさんNGNG
public class Sex {
 public static final UNKNOWN = 0;
 public static final MALE = 1;
 public static final FeMALE = 2;
 public static final HOMOSEXUAL = 3;
 private int sex;
 public Sex(int sex) throws SexException {
  try {
   if(0 <= sex & sex <= 3)
    this.sex = sex;
   } else {
    throw new SexException("そんな性別はありません");
   }
  } catch(SexException e){
   e.printStackTrace();
  } catch(Exception e){
   e.printStackTrace();
  }
 }
 public int getSex(){
  return sex;
 }
}
public class Person {
 private Sex sex;
 private String name;
 public Person(String name, Sex sex){
  this.sex = sex;
  this.name = name;
 }
}
0206デフォルトの名無しさんNGNG
お前ら熱いね
0207デフォルトの名無しさんNGNG
public interface Penis {
public String getPenisSize();
}
public abstract class Man implements Penis{}
public class Takeshi extends Man implements Penis {
public String getPenisSize() { return "大きい";}
}
public class Masaru extends Man implements Penis {
public String getPenisSize() { return "小さい";}
}
public class Woman {
public void sex( Penis p ) { System.out.println( "あなたの ちんこ" + p.getPenisSize() + "のね" ); }
}
Woman woman = new Woman();
woman.sex( new Takeshi() );
woman.sex( new Masaru() );
0208デフォルトの名無しさんNGNG
中の人も大変だな
0209デフォルトの名無しさんNGNG
Man implements Penis は余計だった
0210デフォルトの名無しさんNGNG
オブジェクト指向の基本は、現実世界の事象をできるだけ
近い形でコンピュータ上にモデル化すること。
現実社会がコミュニケーションで成り立っているように、
オブジェクト同士もメッセージのやり取りで成り立つ。
メッセージパッシングこそ、オブジェクト指向のエッセンス。
継承なんかは後付けの考えだ。

これは、例を挙げれば、俺が弁当屋に行って海苔弁を買い、
おもちゃ屋に行ってPS2を買うというのを、素直にモデル化するなら、
「弁当屋」「おもちゃ屋」「海苔弁」「PS2」「お金」「注文」
というオブジェクトが出てくる。
「弁当屋」に「お金」と「注文」を渡せば、「海苔弁」が、
「おもちゃ屋」に「お金」と「注文」を渡せば、「PS2」が、
それぞれ返ってくる。

いわゆる
海苔弁 弁当屋.売れ(お金, 注文)
PS2 おもちゃ屋.売れ(お金, 注文)
となる。

これがオブジェクト指向の基本。

(つづく)
0211デフォルトの名無しさんNGNG
しかし、弁当屋は海苔弁ばかり置いてあるわけではなく、
唐揚げ弁当や焼き肉弁当もある。

ここで頭の良いヤシは、海苔弁と唐揚げ弁当と焼き肉弁当の
共通点に気が付く。どれも弁当だと。単におかずの違いだと。
そこで、「弁当」をもっと考えてみる。
「弁当」は「おかず」と「ごはん」から構成されていて、
「値段」がついていると。

海苔弁の場合は
「ごはん」コシヒカリ
「おかず」海苔
「値段」280円
であり、
焼き肉弁当の場合は
「ごはん」コシヒカリ
「おかず」焼き肉
「値段」480円
であると。

オブジェクト指向では、この場合「弁当」をクラスといい、
「ごはん」「おかず」「値段」などをクラスの属性という。

そして「弁当」を考え出したことで、より汎用的な
次のメッセージが出来ることに気がつく。

弁当 弁当屋.売れ(お金, 注文)

(つづく)
0212デフォルトの名無しさんNGNG
頭の冴えているヤシは、さらに「弁当屋」と「おもちゃ屋」にも
共通点があることに気がつく。いわゆる「商店」であり、
なんらかの「商品」を売って、「お金」をもらうのであると。

「商店」をより具体化した「弁当屋」は弁当という商品を売る商店であり、
「おもちゃ屋」はおもちゃという商品を売る商店であったのである。

オブジェクト指向では、こういう場合、
「商店」と「弁当屋」は継承関係にあるといい、
「商店」をスーバークラス、基底クラスなどといい、
「弁当屋」をサブクラス、派生クラスなどとのたまう。

思考の流れとは逆なのが面白いだろう。

(つづく)
0213デフォルトの名無しさんNGNG
さて、「弁当屋」と一口に言っても、おなじみのほかほか亭もあれば、
ちょっと値段の高い味美弁当屋もある。バイト代が入って懐が暖かい
ときは、味美弁当屋にかぎる。こういう風に、実際に行く弁当屋は
一軒一軒具体的な違いを持っている。

オブジェクト指向では、ほかほか亭や味美弁当屋を「弁当屋」クラスの
具体的な実体、すなわちインスタンスと考える。
紙に書いた弁当屋では弁当は買えない。実際の弁当屋に行かなければ。
すなわち、基本的にはインスタンスに対してメッセージを送ることで
処理は進められていく。
クラスは、インスタンスの雛形であり、インスタンスを作るのに
利用されるというのが基本である。
もし君が弁当屋をはじめるなら、他の弁当屋を参考にするだろう。
そういうことである。

(つづく)
0214デフォルトの名無しさんNGNG
さて、このヤシはたまに友達からレアものビデオなんかも買うのである。

レアものビデオ 友達.売れ(注文,お金)

というわけである。ここでヤシは思索する。
はたして、友達は「商店」なのかと。
しかし、時には「商店」と同じようにものを売ってくれると。
「売れ(注文,お金)」というメッセージは、「商店」だけじゃなく、
友達にも通用すると。
それじゃ、そのメッセージだけ切り出して、「買い物」という
名前にしておこうと。

オブジェクト指向では、この「買い物」をインタフェースとよび、
「買い物」が出来る相手なら誰にでも
「売れ(注文,お金)」というメッセージを送ることができる。
「友達」が「商店」ではないように、
インタフェースを使うことで、継承関係を超えて、
ダイナミックなモデルを実現できるのだ。

そして「友達」はいつも「買い物」のインタフェースでいるわけではなく、
いろんなインタフェースを使ってこのヤシと関係を作り上げている。
さらに、「友達」は親に対しては「息子」のインタフェース、
先生に対しては「生徒」のインタフェースを使っているかもしれない。
0215デフォルトの名無しさんNGNG
みなさん食い物に例えすぎ(w
別にいいけど。。。
どんどん書いてくれ
0216デフォルトの名無しさんNGNG
C++では普通に多重継承してて、JAVAでは出来ないので正直設計がしにくい言語だと思った。
もう慣れたが。
0217デフォルトの名無しさんNGNG
正直>>207はわかりやすい
0218なおしとけNGNG
public interface Penis {
  public String getPenisSize();
}
public abstract class Man implements Penis{}
public class Takeshi extends Man {
  public String getPenisSize() { return "大きい";}
}
public class Masaru extends Man {
  public String getPenisSize() { return "小さい";}
}
public class Woman {
  public void sex( Penis p ) { System.out.println( "あなたの ちんこ" + p.getPenisSize() + "のね" ); }
}
Woman woman = new Woman();
woman.sex( new Takeshi() );
woman.sex( new Masaru() );
0219デフォルトの名無しさんNGNG
良スレ認定
0220デフォルトの名無しさんNGNG
sexを属性(フィールド)にする手法とどっちがいい?
0221デフォルトの名無しさんNGNG
僕の部屋はクラスがないので
グローバル変数だらけです
0222デフォルトの名無しさんNGNG
>>221
どういう喩えでつか?  
0223デフォルトの名無しさんNGNG
>>222
要は本棚とか無いんじゃないの?
0224なんとなくNGNG
>218
なんで/TakeshiとMasaruだけ固有名詞のクラスになってんのかね。
s/Takeshi/LargePenisMan/
s/Masaru/SmallPenisMan/
0225デフォルトの名無しさんNGNG
public abstract class Okama implements Penis{}
public class Hiroshi extends Okama {
  public String getPenisSize() { return "取っちゃった";}
}

Woman woman = new Woman();
woman.sex( new Hiroshi());

何故ManクラスからPenis Interfaceを分離してるかと言えば、
Manクラスの他にもgetPenisSizeメソッドを持つクラスを拡張させられるようにするためである。
もし仮にManクラスにgetPenisSizeメソッドを持たせてあると、このような拡張は不可能である。
これがInterfaceを分離することのメリットである。
0226デフォルトの名無しさんNGNG
つまり、バター犬をManから派生させるのではなく、
chinko インターフェースをつくって
Manと ButterDog の両方にインプリメント(実装)すべきだということだな。
このやりかたなら、将来、バイブレーターを作ったときも、同じインターフェースが使える。
バイブレーターと Man は継承関係の必然性がないし。
0227デフォルトの名無しさんNGNG
>>224
抽象化のセンス無し
0228デフォルトの名無しさんNGNG
>>226
いやーわかりやすい。(w
0229デフォルトの名無しさんNGNG
>>226
public abstract class Man implements Penis{}
はどういう意味、働きをもってくるの?
0230229NGNG
あっ却下
>>218
0231デフォルトの名無しさんNGNG
>>218
これって多重継承に似ているね。
引数でクラス名を渡しているところが異なるだけで、
クラスを隠蔽化する為に、Java開発者が無理やりinterfaceやabstractを
とってつけたみたいだ。
なぜなら、Javaは全てクラスで表現するという制約を自ら課しているから。
0232デフォルトの名無しさんNGNG
public class Woman {
  public void sex( Penis p ) { System.out.println( "あなたの ちんこ" + p.getPenisSize() + "のね" ); }
}
は、Penisを引数の型に使っても起こられない?
0233デフォルトの名無しさんNGNG
>>229
Manという言葉があっても、それは単に概念とか分類であって
実際にManという"物"が存在する訳ではない。
TakeshiやHiroshiは"物"として存在するが、Manは存在しないという事。
でも後々、TakeshiやHiroshiを個人の単位ではなく、
Manという分類で扱いたくなるかもしれない。
0234デフォルトの名無しさんNGNG
>>232
言葉の意味から考えれば、
public void sex( Man m )
が相応しい。
或いは、
public void insert( Penis p )
など。
0235デフォルトの名無しさんNGNG
>>225 >>218
そもそもhas-aの関係にあるものをそうやってimplementsする
形式にすべきかも疑問。
それじゃis-aの関係になってしまう。
"He is a penis."

集約、コンポジション集約で十分ではないか?

>>231
>なぜなら、Javaは全てクラスで表現するという制約を自ら課しているから。
オブジェクト指向だから当たり前。JavaソースはUMLクラス図でちゃんと表現できる。
C++のソースはどんなソースでもクラス図で表現できるとは限らない。
interfaceやabstract同様の機能はM$がJavaを真似て作ったC#でも取り入れられている。
0236デフォルトの名無しさんNGNG
別に問題ないんじゃない
PenisはHourseにだってimplementsできる。
woman.sex( new Hourse )とか、、
そんな獣姦ビデオとかあるし。
0237デフォルトの名無しさんNGNG
知識は沢山持ってても抽象化のセンスが乏しい奴はいる。
そういうSEは結構いたな。
抽象化ってのは別部分の能力なんだろうか。
要は分類だよな。
0238デフォルトの名無しさんNGNG
>>235
>abstract同様
抽象クラスと純化相関数入りのクラスにどれほどの違いがあるんですか?
0239デフォルトの名無しさんNGNG
>>238
抽象クラスにも実装済みで継承可能なメソッドを入れることができるでしょう。
抽象クラスは中に少しでもabstractなメソッドがあればクラスも抽象(abstract)と見なされる。
抽象クラスは継承した具象クラスがないと使えない。
抽象クラスはインスタンスを作れない。

Javaには仮想関数という用語は無い。
Javaはvirtualをつけなくても継承できる。
変わりにfinal宣言をすると継承を禁止する。
いうまでもなく、finalとabstractを併用することはできない。

つーか純仮想関数って何?
UMLでもそんな言葉聞きません。
0240デフォルトの名無しさんNGNG
>要は分類だよな。
Sヨ板がいまだに学問・理系カテにありますから・・・。
0241デフォルトの名無しさんNGNG
>>239
C++も知らないくせにC++との差別化とかほざいてるわけか。浅いな。そこが。
0242デフォルトの名無しさんNGNG
>純仮想関数
純粋仮想関数の typo だと思われ
0243デフォルトの名無しさんNGNG
>>241
Javaも知らないくせにJavaを批判しているわけか。浅いな。そこが。

そもそも純仮想関数という言葉もUMLでは通じないぞ。
C++の用語はUMLでは殆ど死語と化している。
0244デフォルトの名無しさんNGNG
>>243
言語機能とオブジェクト指向用語とごっちゃになってない?
0245デフォルトの名無しさんNGNG
純粋仮想関数ってJavaでいうabstractメソッドのことか。

C++の場合オーバーライドし忘れてもコンパイルエラーにならないのか。
Javaだとエラーが出てくれるのでメンテナンスが楽。

C++ではこう定義するのか
virtual void doMethod() = 0;

ちょっと奇怪に見え
0246デフォルトの名無しさんNGNG
低能な奴ほど言葉の問題にやたらこだわろうとするな。
もちろん言葉は大切、慎重に選んで使わなきゃならないが、
ここで重要なのは指向または志向または思考なわけで、
大体のニュアンスが伝わればなんら問題ない。
0247デフォルトの名無しさんNGNG
>C++の場合オーバーライドし忘れてもコンパイルエラーにならないのか。
エラーになるよ。純粋仮想関数を含んだクラスのインスタンスは
生成できないし、それを継承したクラスが純粋仮想関数をオーバー
ライドしなければやっぱりインスタンスは生成できない。
0248デフォルトの名無しさんNGNG
>virtual void doMethod() = 0;
>
>ちょっと奇怪に見え
確かに。
vtable へのポインタを 0 で初期化するという意味らしい。
0249デフォルトの名無しさんNGNG
>235
じゃあ「interface Penisable」だったらいいのか?
0250書き直しNGNG
public interface Penisable {
  public String getPenisSize();
}
public abstract class Man implements Penisable{}
public class Takeshi extends Man {
  public String getPenisSize() { return "大きい";}
}
public class Masaru extends Man {
  public String getPenisSize() { return "小さい";}
}
public class Woman {
  public void sex( Penisable p ) { System.out.println( "あなたの ちんこ" + p.getPenisSize() + "のね" ); }
}
Woman woman = new Woman();
woman.sex( new Takeshi() );
woman.sex( new Masaru() );

その後、Okamaクラスを追加する必要が出てきた。
public abstract class Okama implements Penisable{}
public class Hiroshi extends Okama {
  public String getPenisSize() { return "取っちゃった";}
}

Woman woman = new Woman();
woman.sex( new Hiroshi());
0251デフォルトの名無しさんNGNG
>>249
>>225や>>226や>>236を読みなさい。
俺は変える必要は何も無いと思う。
そもそもPenisableって意味わからん。
0252デフォルトの名無しさんNGNG
>>251
陰根可能
■ このスレッドは過去ログ倉庫に格納されています