アカウント名:
パスワード:
ふるーいオブジェクト指向なんてない頃のPGなんで、JAVA詳しくないが、これはできるだろう(正確にはできた(変えた)ように見せかける)
上司「このメソッド名分かりにくいから分かりやすい名前にして」僕「そのメソッドは親クラスのメソッドをオーバーライドしてて変えられないんです」上司「あっそうなんだ…ふーん」
継承した子どものクラスで新しく別の名前メソッド作って、その新メソッドから、自分の親クラスから継承したメソッド呼べばいいんでないの?同じ内容のメソッド2つできちゃうけど。
出来ないんだっけ?
オーバーライドは親クラスのメソッドの動作を置き換えるということ。シグニチャーが異なるのでは意味がない。
例えば「親クラスのメソッド」ってのがoutput()で、それをwriteToFile()とかに変えて、って話なんじゃね?んで、writeToFile()内でoutput()を呼べばOKなんだけど、それでイイかってのが#3324420の問題提起かと。
オーバーライドが必要な状況においては、そんな対応はできませんよ。
>シグニチャーが異なるのでは意味がない。オーバーライドは手段であって目的ではないだろうに。
>このメソッド名分かりにくい時点である程度親クラスの設計間違てるんだし。
>シグニチャーが異なるのでは意味がない。なんて言ってる時点で手段と目的勘違いしてないかい?目的はオーバーライドする事でなく目的の動作をするメソッド作ることだろうに。
子クラスでオーバーライドした元の名前と同じままのメソッドを別の名前のメソッドから呼ぶ。位の機転がなぜ効かないのかね。
親クラスのメソッドがoutput。新規追加するのがwriteToFileメソッド。で、writoToFileからoutputを呼ぶことはできるよ。
けど、writeToFileは誰が実行するの?呼び出し元クラスはoutputしか知らないし、outputしか実行してくれないんじゃね?
「writeToFileからoutputを呼ぶ」ってのは方向が逆ですね。「outputからwriteToFileを呼ぶ」ようにすればいいんです。
C++的に書くなら、ヘッダで
virtual void output() override { writeToFile(); }void writeToFile();
とかしておいて、ソースの方ではwriteToFileの実装だけ書く。
#似たようなことはちょくちょくやってますが、名前が気に入らないといった理由でやったことはないなぁ…
Template Method パターン?
>呼び出し元クラスはoutputしか知らないし
そもそも、この話は「新規に作成してるクラス」だろうと。
> そもそも、この話は「新規に作成してるクラス」だろうと。だからでしょ。既存の呼び出し元クラスは親クラスのメソッドは知っててもそんな今新規に作ったクラスのメソッドなど知らんよ。
だから、何で既存の呼び出し元クラスが「今作られた新規クラスを呼ぶのかと」
新規クラスと認識してるなら新規メソッド呼ぶし、親クラス読んでるならそもそも新規クラス関係ないだろと。
次のような処理を例として考えます。■処理-----------------------1. データを読込む(※)2. データを加工する3. 結果をDBに書込む4. 終了ログを出力する※但し、読込むデータの形式は、CSVとDBの2種類の処理があります。※読込形式のみ違い。後の処理は同じ。-----------------------
入力形式だけが違うので、次のようなクラスを実装します。■データ読込クラス-----------------------【親】Readerクラス ※readメソッド:実装は空っぽ。【子】CsvReaderクラス ※readメソッド:CSVファイルを読込む処理を実装。【子】DbReaderクラス ※readメソッド:DBから読込む処理を実装。-
馬鹿なのか、オーバーライドの意味がわかってないのか。わざわざプログラムを動かなくする人ってこういう「機転」をきかせる人なんだろうな。
いやそれオーバーライドする意味無いですやん。同じシグニチャで実装変えられるのが味噌なのに。別名付けていいならそもそもオーバーライドする必要自体が無いでしょ。
ならそもそも「リンク先の元の話がオーバーライドする必要性が元々ない」って話でしかない。
>同じシグニチャで実装変えられるのが味噌なのに。だから目的と手段を勘違いしてる。
オーバーライドすることが目的じゃないだろと。
目的があるからオーバーライドという手段を使っているのでしょ。呼び名を変えたら目的が達せられないじゃないか。
#まあ、動けばどんなソースでも問題ないという考えの人はしらん。
これから書くことは「そうあるべきではない」事案であることは重々、承知の上で
オーバーライドは手段であって目的ではないだろうに。
話の種として、「オーバーライドが目的になっていた事案」を見かけたことがある。
具体的には某大手メーカーが、.NET Frameworkベースのソフトを、自社のとある部門向けに、結構なコストをかけて改修した。認証周り等のクラスをオーバーライドして、自社内インフラと連携させた感じ。ここまではいい。オーバーライドの正しい使い方だ。
問題はその次の開発で発生した。同社内別部門向けのソフト開発だ。「既に予定以上の工数をかけているので、前述のソフトの改修は禁止」
それやったら継承したメソッドすっとばして新しく追加した方だけ呼ばれるのを防げなくなるぞ。
>呼ばれるのを防げなくなるぞ。
ならんよ。正しくコーディングしてれば。新規すっ飛ばして、継承だけ呼ばれるってパターンも同様。
追記オーバーライドでなく(オーバーライドの中で継承した親メソッドを呼ぶ)、完全なオーバーライド(再定義)でも同様。ただしくやってる新規に定義した方の中身は「親から継承した名前の自分でオーバーライドしたメソッドを呼ぶ(だけな)訳だからね。
新規を読んだ時点で継承したメソッドは呼ばれる。正しくコーディングしていれば。
それのどこが「正しくコーディング」なんだよ。
素人邪魔ってこういうことなんだな。継承によるoverideの仕様理解せずにどや顔なんて・・・まさか、伝説のstaticおzあせdrftgyふじこ
できない事とできるけどやるべきじゃない事はどっちも「できない」だよ。子クラスでその子クラスでしか使えない新しいメソッドを、そんな感想レベルの意見でいちいち作ったら継承した意味がなくなってしまう。継承によってせっかく同じ共通のインターフェースを持ったのに。
上司「馬鹿じゃなくて上司って名前で呼ばせろ」僕「わかりました、名札変えときます」みんな「馬鹿は馬鹿だよなー」
おぶじぇくとなんとかは分からないけど、こういう事?
より多くのコメントがこの議論にあるかもしれませんが、JavaScriptが有効ではない環境を使用している場合、クラシックなコメントシステム(D1)に設定を変更する必要があります。
あと、僕は馬鹿なことをするのは嫌いですよ (わざとやるとき以外は)。-- Larry Wall
リンク先で。。。 (スコア:0)
ふるーいオブジェクト指向なんてない頃のPGなんで、
JAVA詳しくないが、これはできるだろう(正確にはできた(変えた)ように見せかける)
上司「このメソッド名分かりにくいから分かりやすい名前にして」
僕「そのメソッドは親クラスのメソッドをオーバーライドしてて変えられないんです」
上司「あっそうなんだ…ふーん」
継承した子どものクラスで新しく別の名前メソッド作って、その新メソッドから、自分の親クラスから継承したメソッド呼べばいいんでないの?同じ内容のメソッド2つできちゃうけど。
出来ないんだっけ?
Re: (スコア:0)
オーバーライドは親クラスのメソッドの動作を置き換えるということ。
シグニチャーが異なるのでは意味がない。
Re: (スコア:0)
例えば「親クラスのメソッド」ってのがoutput()で、それをwriteToFile()とかに変えて、って話なんじゃね?
んで、writeToFile()内でoutput()を呼べばOKなんだけど、それでイイかってのが#3324420の問題提起かと。
Re: (スコア:0)
オーバーライドが必要な状況においては、そんな対応はできませんよ。
Re: (スコア:0)
>シグニチャーが異なるのでは意味がない。
オーバーライドは手段であって目的ではないだろうに。
>このメソッド名分かりにくい
時点である程度親クラスの設計間違てるんだし。
>シグニチャーが異なるのでは意味がない。
なんて言ってる時点で手段と目的勘違いしてないかい?
目的はオーバーライドする事でなく目的の動作をするメソッド作ることだろうに。
子クラスでオーバーライドした元の名前と同じままのメソッドを別の名前のメソッドから呼ぶ。
位の機転がなぜ効かないのかね。
Re: (スコア:0)
親クラスのメソッドがoutput。
新規追加するのがwriteToFileメソッド。
で、writoToFileからoutputを呼ぶことはできるよ。
けど、writeToFileは誰が実行するの?
呼び出し元クラスはoutputしか知らないし、outputしか実行してくれないんじゃね?
Re:リンク先で。。。 (スコア:1)
「writeToFileからoutputを呼ぶ」ってのは方向が逆ですね。「outputからwriteToFileを呼ぶ」ようにすればいいんです。
C++的に書くなら、ヘッダで
とかしておいて、ソースの方ではwriteToFileの実装だけ書く。
#似たようなことはちょくちょくやってますが、名前が気に入らないといった理由でやったことはないなぁ…
Re: (スコア:0)
Template Method パターン?
Re: (スコア:0)
>呼び出し元クラスはoutputしか知らないし
そもそも、この話は「新規に作成してるクラス」だろうと。
Re: (スコア:0)
> そもそも、この話は「新規に作成してるクラス」だろうと。
だからでしょ。
既存の呼び出し元クラスは親クラスのメソッドは知っててもそんな今新規に作ったクラスのメソッドなど知らんよ。
Re: (スコア:0)
だから、何で既存の呼び出し元クラスが「今作られた新規クラスを呼ぶのかと」
新規クラスと認識してるなら新規メソッド呼ぶし、親クラス読んでるならそもそも新規クラス関係ないだろと。
Re: (スコア:0)
次のような処理を例として考えます。
■処理
-----------------------
1. データを読込む(※)
2. データを加工する
3. 結果をDBに書込む
4. 終了ログを出力する
※但し、読込むデータの形式は、CSVとDBの2種類の処理があります。
※読込形式のみ違い。後の処理は同じ。
-----------------------
入力形式だけが違うので、次のようなクラスを実装します。
■データ読込クラス
-----------------------
【親】Readerクラス ※readメソッド:実装は空っぽ。
【子】CsvReaderクラス ※readメソッド:CSVファイルを読込む処理を実装。
【子】DbReaderクラス ※readメソッド:DBから読込む処理を実装。
-
Re: (スコア:0)
馬鹿なのか、オーバーライドの意味がわかってないのか。
わざわざプログラムを動かなくする人ってこういう「機転」をきかせる人なんだろうな。
Re: (スコア:0)
いやそれオーバーライドする意味無いですやん。同じシグニチャで実装変えられるのが味噌なのに。
別名付けていいならそもそもオーバーライドする必要自体が無いでしょ。
Re: (スコア:0)
ならそもそも「リンク先の元の話がオーバーライドする必要性が元々ない」
って話でしかない。
>同じシグニチャで実装変えられるのが味噌なのに。
だから目的と手段を勘違いしてる。
オーバーライドすることが目的じゃないだろと。
Re: (スコア:0)
目的があるからオーバーライドという手段を使っているのでしょ。
呼び名を変えたら目的が達せられないじゃないか。
#まあ、動けばどんなソースでも問題ないという考えの人はしらん。
Re: (スコア:0)
これから書くことは「そうあるべきではない」事案であることは重々、承知の上で
オーバーライドは手段であって目的ではないだろうに。
話の種として、「オーバーライドが目的になっていた事案」を見かけたことがある。
具体的には某大手メーカーが、.NET Frameworkベースのソフトを、自社のとある部門向けに、結構なコストをかけて改修した。
認証周り等のクラスをオーバーライドして、自社内インフラと連携させた感じ。
ここまではいい。オーバーライドの正しい使い方だ。
問題はその次の開発で発生した。同社内別部門向けのソフト開発だ。
「既に予定以上の工数をかけているので、前述のソフトの改修は禁止」
Re: (スコア:0)
それやったら継承したメソッドすっとばして新しく追加した方だけ呼ばれるのを防げなくなるぞ。
Re: (スコア:0)
>呼ばれるのを防げなくなるぞ。
ならんよ。正しくコーディングしてれば。
新規すっ飛ばして、継承だけ呼ばれるってパターンも同様。
追記オーバーライドでなく(オーバーライドの中で継承した親メソッドを呼ぶ)、完全なオーバーライド(再定義)でも同様。
ただしくやってる新規に定義した方の中身は「親から継承した名前の自分でオーバーライドしたメソッドを呼ぶ(だけな)訳だからね。
新規を読んだ時点で継承したメソッドは呼ばれる。正しくコーディングしていれば。
Re: (スコア:0)
それのどこが「正しくコーディング」なんだよ。
Re: (スコア:0)
素人邪魔ってこういうことなんだな。
継承によるoverideの仕様理解せずにどや顔なんて・・・
まさか、伝説のstaticおzあせdrftgyふじこ
Re: (スコア:0)
できない事とできるけどやるべきじゃない事はどっちも「できない」だよ。
子クラスでその子クラスでしか使えない新しいメソッドを、そんな感想レベルの意見でいちいち作ったら継承した意味がなくなってしまう。
継承によってせっかく同じ共通のインターフェースを持ったのに。
Re: (スコア:0)
上司「馬鹿じゃなくて上司って名前で呼ばせろ」
僕「わかりました、名札変えときます」
みんな「馬鹿は馬鹿だよなー」
おぶじぇくとなんとかは分からないけど、こういう事?