トップページ⇒tech
120コメント24KB

オーバーロードって必要?

■ このスレッドは過去ログ倉庫に格納されています
0001デフォルトの名無しさんNGNG
引数にデフォルト値が設定できる言語の場合オーバーローディングって必要?
0002shigeNGNG
Ruby >>>>>>>>>>>>>>>> C++
0003デフォルトの名無しさんNGNG
>>1
ちょっと思うな。

ところで、くだ質あればこのクソスレって必要?
0004デフォルトの名無しさんNGNG
親インターフェースの場合無難な対応をして子インターフェースの場合より気の利いた対応をしたい場合は必要。
0005デフォルトの名無しさんNGNG
>>4
オーバーライド + オーバーロードな場合?
0006デフォルトの名無しさんNGNG
むしろ俺はポリモーフィズムって必要なのか知りたい。
インターフェースもなー
0007デフォルトの名無しさんNGNG
void hoge(SuperClass a) {
a.someMethod();
}
void hoge(SubClass a) {
a.anotherMethod();
hoge((SuperClass)a);
}
という場合。食べ物が与えられた場合ただ口に入れてとんかつが与えられた場合はソースかけてから食べたいときとか。
0008デフォルトの名無しさんNGNG
>>7
うまい事言うね。
00091NGNG
ふむ。じゃあ親子関係にないクラスの場合は不必要? 共通のインターフェイスを持っていないということは別の概念を表しているわけで別の概念を対象とするメソッドは別の名前がつくべきでは?
0010デフォルトの名無しさんNGNG
>>9
オーバーロードは別の概念のメソッドをまとめるためのものじゃないじゃん。
001110NGNG
そもそも親子関係でもなく、そのクラス自身でもない場合にオーバーロードはない。
00121NGNG
>10
だからいらないっていってるんですが。
0013デフォルトの名無しさんNGNG
オーバーワークは体に毒です。
0014デフォルトの名無しさんNGNG
>>12
文字列操作クラスを使いたいとき、

CStringとcharがどっちも使えれば便利だね。
CStringで渡したときはCStringで帰ってくると便利だね。
CString渡した場合は長さを表す引数はいらないね。
0015デフォルトの名無しさんNGNG
演算子オーバーロードはどうよ?
00161NGNG
>10
言い方があいまいだった。12は11読む前に書いた。ごめそ
interface A {
void b(C obj);
void b(D obj);
}

CとDが関係ないクラスの場合は必要ないんじゃないってこと
0017デフォルトの名無しさんNGNG
いるんじゃない?(Java)
0018デフォルトの名無しさんNGNG
>14
charの配列を文字列として使うのってオブジェクト指向的には邪道では?
0019デフォルトの名無しさんNGNG
省略可能な引数があるとき、呼ぶほうは楽だろ?
0020デフォルトの名無しさんNGNG
演算子オーバーロードはもっといらん
0021デフォルトの名無しさんNGNG
オーバーロードは必要。
いちいちメソッド名考えるのもめんどくさいし、
メソッドごとにドキュメントを書くのもイヤだ。

すべて do(...) でいいよ。
0022デフォルトの名無しさんNGNG
>>21
それはダメ!(w
0023デフォルトの名無しさんNGNG
>>18
コンストラクタの引数に渡して文字列に変換するんだから,
いいんでないの?
0024デフォルトの名無しさんNGNG
馬鹿ですか?
002510NGNG
>>16
CとDに意味的関連性のないオーバーロードなんて普通はしないだろ。
>>1の投稿ではそんなこと言ってないし。

関係ないのにオーバーロードにしてるとしたら、そいつがセンスないだけ。
0026デフォルトの名無しさんNGNG
>>20
あればあったで便利だす
0027デフォルトの名無しさんNGNG
>>18
似たような性質のクラスでも、
継承関係にあるとは限らないしなあ。
0028デフォルトの名無しさんNGNG
オーバロードが〜ひらかーれた〜
002910NGNG
25に追記。
例えばRectangleとInt4つとか不要か?意味は一緒。
どちらかのパターンしか用意してないと、
使う人に使い方を強制するし、不便だぞ。

引数にデフォルト値を設定できるだけでカバーできない。
0030デフォルトの名無しさんNGNG
>>28
オーラロードかよっ
0031デフォルトの名無しさんNGNG
オーバーライドって必要か?
0032デフォルトの名無しさんNGNG
オーバーロード〜第2章〜
00331NGNG
>25
意味的に関係あるなら共通のインターフェースを持っているべきだからメソッドは1つでいいからオーバーロードは必要ないという主張なのですが?
0034デフォルトの名無しさんNGNG
>>32
13章ぐらいいっとけー。
0035デフォルトの名無しさんNGNG
トラブルー
0036デフォルトの名無しさんNGNG
class Rectangle
{
Rectangle (Point LeftUpper, Point RightBottom);
Rectangle (Point LeftUpper, Size size);
}
は?
003725NGNG
>>33
君のいうインターフェースとは?
普及してる言語で、現実的に継承とかインタフェース(例えばJavaのinterface)の実装
とかをやってる場合、関係があるからといって同じ継承関係にあるとは限らないのでは?
0038デフォルトの名無しさんNGNG
オーバーロードのまま放置プレイすると、
CPUがこんがり焼ける罠。
003933NGNG
>37
たとえば?
004025NGNG
また追記。
>>19のような場合はどうするのさ?
004125NGNG
>>39
例えは>>40の通り
いちいち、
new Rectangle(int, int, int, int)とかまさないといけないとしたら、
かなり不便だと思う。
0042デフォルトの名無しさんNGNG
>>1 を見ると、Javaは眼中にないな...
0043デフォルトの名無しさんNGNG
>>1
Smalltalk が合ってると思われ。
004440NGNG
>40
引数にデフォルト値を指定できる場合って言ったけど。

0045デフォルトの名無しさんNGNG
>>36
それは名前を区別してホスイ
RectanglePointToPoint (Point LeftUpper, Point RightBottom);
RectanglePointBySize (Point LeftUpper, Size size);
004636NGNG
どっちもRectangleを作るのに名前は別なの〜?
004725=40NGNG
>>40の19じゃなくて29(^^;;;;;;すまそ
0048デフォルトの名無しさんNGNG
ん? 44は39の発言?
0049デフォルトの名無しさんNGNG
48あ、そうです。ごめそ
0050デフォルトの名無しさんNGNG
オーバーライドは完全に必要ねぇな。
0051デフォルトの名無しさんNGNG
>>50
ということは抽象クラスもインタフェースも不要っとφ(. .)
0052デフォルトの名無しさんNGNG
>>50
あんたにゃpolymorphismは必要ないな
0053デフォルトの名無しさんNGNG
29は矩形を2点で表すのは数学でよく使うしRectangle渡してもどうせ頂点の座標しか使わないってわかりきってるからInt4つで渡したくなるという特別な場合だからいいとしてむしろ俺は39のほうが問題だと思うぞ。
0054デフォルトの名無しさんNGNG
知ったかうざいよ。
0055デフォルトの名無しさんNGNG
オーバーライドこそ必要。
0056デフォルトの名無しさんNGNG
オーバーロードもオーバーライドもあれば使うしなければ使わない。
あればあったで便利だが、必ず必要なものじゃない。

おまえらもプログラマならこのくらい割り切っていこうぜ。ざっくばらんにな。
0057デフォルトの名無しさんNGNG
>>53
動的型付の OOPL しか使ったことないとか。
0058デフォルトの名無しさんNGNG
そいやオーバーロードのないOOPLってあるけどオーバーライドのないOOPLってあったっけ
0059デフォルトの名無しさんNGNG
継承がない OOPL なら。
0060デフォルトの名無しさんNGNG
そもそもCLOSみたいな言語の場合オーバーライドとオーバーロードの違いが無いぞ。
0061デフォルトの名無しさんNGNG
function a(MoeCharactor moe)
kill(moe)
end

function a(Chobits chii)
fuck(chii)
end
0062デフォルトの名無しさんNGNG
必要だと思います
0063shigeファンNGNG
ヴァリアントに型を知ってるオブジェクトなら、Overloadは必要ないよね。
そもそもOverloadする言語が型を知らない言語からextendsしてOOPにしているから、
Overloadは必要なんだよ。
そうだよな、shige兄貴!!そういえばRyuuBee!にはoverloadあるんかいな?
0064デフォルトの名無しさんNGNG
>>63
引数の数が激しく違う場合は?

って言うか様々な引数取るのは良いけど受け取る側のメソッドって悲惨だね・・・。
0065デフォルトの名無しさんNGNG
>>64
自分が作る分は必要最小限しか用意しないけど、
ライブラリにはいろんなオーバーロードを望む罠だね。
0066デフォルトの名無しさんNGNG
SmallTalker手をあげて。
3がウィンドウを出すってほんと?
0067デフォルトの名無しさんNGNG
>>65
確かに。w

0068shigeファンNGNG
メソッドの引数を構造体渡しに統一するという方法は?
0069デフォルトの名無しさんNGNG
>>68
構造体の参照渡し

じゃ無いとダメっす。

だからそれやるとウケ側のメソッドがswitchの嵐に・・・。
0070shigeファンNGNG
メンバーってMethodだけじゃないような気もするけど、fieldとか
method以外のメンバー使って解決できないもんなのかねえ?
0071デフォルトの名無しさんNGNG
ポリモーフィズムって必要なのか?意味わかんね。
0072デフォルトの名無しさんNGNG
>>63
言語仕様にはない。mutimethod 対応に改造した人はいたな。
似たような機能のライブラリ。
http://www.ruby-lang.org/en/raa-list.rhtml?name=overload

変に型を制限されると、
インタフェイス(メソッド)は互換性がある独自クラスのオブジェクトを投げられなくなってしまう。
動的型言語は、ライブラリ側で抽象クラスや interface を用意しなくとも
多態性が確保できるのが特徴なわけだし。
0073デフォルトの名無しさんNGNG
例えばClass Aがあって、そのメンバを全部純粋仮想関数にして
それから派生した Class BとClassCを作る。
んでもって、
A b = new B;
A c = new C;
みたく定義すればbとc区別無く画一的な操作が可能。
基本だがこういう使い方をすれば
オーバーライドにも意味が出てくる。
まあ大概はそんなうまくいかないけどね。

俺は何は無くとも演算子オーバーロードはスゲエ必要だと思う。
STLコンテナに自作クラス入れる場合、
これが無いとポインタ入れるしかなくなる。
0074デフォルトの名無しさんNGNG
ハゲドウ
0075デフォルトの名無しさんNGNG
C++ってへぼいな。簡単なことをするためにテンプレートなんか使わなくちゃいけない。
0076デフォルトの名無しさんNGNG
そうか・・・C++を使ったことがないから
いまいち演算子オーバーロードの恩恵に

いや、JavaでもStringだけは特別だったな
確かに無いと困るな

困りはしないか
でも面倒くさくなるな

やっぱり必要
0077デフォルトの名無しさんNGNG
>>73
ファクトリーメソッド?
0078デフォルトの名無しさんNGNG
低級プログラマは使いこなせないからねぇ、C++は
0079デフォルトの名無しさんNGNG
>>78
頑張って少しずつ覚えていってくださいね。
0080デフォルトの名無しさんNGNG
おれも応援するよ。 >>78、くじけるなよ!
0081デフォルトの名無しさんNGNG
>>77
ごめん、ファクトリーメソッドって何?

まあSTLは演算子を変えなくても
他にやりようはあるんだけど、
例えば、ClassAがClass Xの配列のポインタを持ってたとして
void A::operator=( const A& other)
{
Class Xの配列をコピー
}
と定義すれば、
A a1;
A a2;
a1 = a2;
ってな具合に、不整合なくコピーすることが出来る。
やっぱ、あると便利。
0082デフォルトの名無しさんNGNG
C++で、構造体の比較が面倒なので、
クラスにして比較演算子を定義した。
違う構造体どうしの比較ならまだしも、
同じ構造体の比較演算子くらい、
自動生成しろといいたい。
(演算子が定義できるだけましか?)
0083デフォルトの名無しさんNGNG
(´-`).。oO(コピー先のインスタンスのclass Xへのポインタが挿す先はどうなるんだろう…)
0084デフォルトの名無しさんNGNG
>>82
単純にバイナリレベルで比較すりゃ良いものでも無いからだろ。
構造体が char** 型のフィールド持ってたらどうすんの?
008582NGNG
>>84
デフォルトのコピーコンストラクタや、
代入演算子と、同じ問題だろ。
0086デフォルトの名無しさんNGNG
(´-`).。oO(構造体同士のビットパターンの比較なんて…)
008782NGNG
>>86
パディングがあるんだから、
ビットパターンなんていうわけない。
0088デフォルトの名無しさんNGNG
>デフォルトのコピーコンストラクタや、
>代入演算子と、同じ問題だろ。
つまり、「デフォルトの比較演算子は危険だから、忘れないうちに定義しとけ」っつー問題に行きつくわけだ。
0089デフォルトの名無しさんNGNG
そういや初期のObjectPascalってオーバーロード無かったけど、いつのまにか
実装されたな。
009082NGNG
>>88
デフォルトのコピーコンストラクタも、
代入演算子も、俺は便利に使わせてもらってる。
あんたはどうよ?
多少危険でも、利便性を優先し、
必要なら自分で定義しなってスタンスは、
俺の性に合っている。
0091ワードルNGNG
オーバードライブ
波 紋 疾 走 + 「ロードローラーだッ!」 = オーバーロード
009288NGNG
>>82
そもそも俺の書くソースには、コピーコンストラクタや代入演算子の呼ばれるところ、
ほとんど無いわ。
0093デフォルトの名無しさんNGNG
コピーしまくるコードって美しくないと思うのは俺だけ?
009482NGNG
>>92
なんじゃそりゃ(藁)
いや、ばかにしてるんじゃないぞ。
落ちもついたようなので、俺も落ちる。
0095デフォルトの名無しさんNGNG
>>83
AのメンバであるX*が単に参照なら
X*をコピーするだけでいいです。
それがA専用のXのインスタンスを指すポインタなら
X自体もコピーする訳です。
当然、Xにも=のオーバーロードを定義します
0096デフォルトの名無しさんNGNG
単純に使用頻度が低いからじゃないのだろうか。デフォルトの==演算子が
用意されなかったのは。==があれば!=も無い訳にはいかないだろうし、
使わないのに余計なコードが増えるの何だかいやだ。
0097デフォルトの名無しさんNGNG
>>93
意味違い
0098デフォルトの名無しさんNGNG
継承は使える。
カプセル化も使える。
しかしポリモーフィズムだけは必要がない。
0099デフォルトの名無しさんNGNG
>>98
なんで継承とカプセル化は「使える」なのに、
ポリモーフィズムだけは「必要がない」なんだ?
0100デフォルトの名無しさんNGNG
!=は!(==)だから増えないんじゃないの?
比較は==と<だけありゃいいじゃん。
0101デフォルトの名無しさんNGNG
>>99
使える局面にぶち当たってないんだろうね。
0102デフォルトの名無しさんNGNG
ポリモーフィズムは必要でしょ?
0103デフォルトの名無しさんNGNG
継承はなくても言いがポリモーフィズムだけは
絶対つけてくれ。ポリモーフィズムがないと何も出来ん。
0104デフォルトの名無しさんNGNG
継承無しでポリモーフィズムって、ダイナミックなダイナミックタイピングの言語限定ですね
0105デフォルトの名無しさんNGNG
ポリモーフィズム使えなかったらフレームワーク作れません。
0106デフォルトの名無しさんNGNG
ダイナミックタイピングなんてーのがあるんだ。
継承あってのポリモフィズムだと思ってた。
0107デフォルトの名無しさんNGNG
動的型付けの言語なら、継承が無くてもポリモーフィズムは可能。
selfがそーでなかったかな?
0108107NGNG
動的な動的型付けの言語ね。
0109デフォルトの名無しさんNGNG
型クラスのある言語なら、継承が無くてもポリモーフィズムは可能。
0110デフォルトの名無しさんNGNG
凡化せずに、ポリモーフィズムをうたってみても、
単に関係ないものをいっしょくたに扱っているだけと
区別できないように思うんだけど、その辺どう?
0111デフォルトの名無しさんNGNG
>単に関係ないものをいっしょくた
無意味な継承をするのと同じかと。

クラス階層という枠組みがあったほうが把握しやすいのは確かだけど、
区別してやるのは結局人間だからねえ。
0112デフォルトの名無しさんNGNG
波紋オーバードライブ
0113デフォルトの名無しさんNGNG
>111
だから、お前はダメなんだな。
いろいろな状況を考えろ。
でも、エンジニアじゃなかったらゴメンな。
0114デフォルトの名無しさんNGNG
...
0115デフォルトの名無しさんNGNG
書き込みテスト
0116デフォルトの名無しさんNGNG
test
0117デフォルトの名無しさんNGNG
>>21
イイ!
0118デフォルトの名無しさんNGNG
必要だよ
0119デフォルトの名無しさんNGNG
今時オーバーロードは必須
デフォルトの引数は便利だけど時に破綻するので
C#では廃止されたよ
0120デフォルトの名無しさんNGNG
== は !(L<R || R<L) だから < だけあればよさげ
しかし自動で生成された < なんてとても使い物にならん気もする。
■ このスレッドは過去ログ倉庫に格納されています