質問者
privateメソッドを overrideしたい

質問
すべての返信
-
未熟者 さんからの引用 確かに派生クラスに公開していないので、overrideできないとは 思っていたのですが、何かしら 方法があるのではと。
どうしても、Method1メソッドが呼ばれるのが、まずかったので、違うクラスでMethod1を書き換えたんです。
基本的には無理でしょう。
この場合は似たようなクラスを再実装するしかないのではなかろうかとも思えますが、現状の抽象的な話ではなんとも言いかねます。
未熟者 さんからの引用 見当違いの発言をしてしまい、申し訳ありませんでした。
その辺は気にしなくて良いかと。
ただ、質問する際はどのような目的があってそれをやりたいのかを明確にしておくと良いかもしれません。
(もちろん、解決できるかどうかはその命題次第です)
-
外池 さんからの引用 元クラスでPrivateなメンバーは、派生クラスでは「無いも同然」なので、同じ名前のメンバーを(再度)定義してやってOKだと思いますよ? class2 で同じ名前のメンバーを定義しても、class1 のコードから呼び出される Method1 は依然として class1 で定義された Method1 なので、おそらく元質問者さんの解決にはつながらないのではと思います。
じゃんぬねっと さんからの引用 override (乗り越えて定義) と overwrite (上書き) これって、VB のキーワードの Overrides と Shadows にそれぞれ対応するのでしょうか。
使い分けが難しそうな表現ですね(^^;
元質問者さんの目的は、おそらく Shadows ではなく Overrides だと私は解釈しています。
その場合、アクセスレベル(Private かどうか)だけでなく、Overridable になっていないメソッドを Overrides しようとされていることにも、残念ながらとても無理があります。Azulean さんが書かれた「似たようなクラスを再実装」に似た方法になりますが、class1 のコードにおいて Method1 を呼び出すメソッドのすべてを class2 で Overrides でき、かつ、それらのメソッド内のすべてのコードが class2 で再実装できれば、class1 の Method1 が呼び出されることを迂回することができますが、これは現実的じゃないと思いながら書いてます。もしそれができれば、クラスごと再実装するよりかは手間が省けます。
# 私の場合、class1.Method1 内のバグを回避する目的で、前にそうしたことがあります…。 -
TH01 さんからの引用 外池 さんからの引用 元クラスでPrivateなメンバーは、派生クラスでは「無いも同然」なので、同じ名前のメンバーを(再度)定義してやってOKだと思いますよ? class2 で同じ名前のメンバーを定義しても、class1 のコードから呼び出される Method1 は依然として class1 で定義された Method1 なので、おそらく元質問者さんの解決にはつながらないのではと思います。
うーん、こうなると、元質問者さんの置かれている状況(元質問者さんの意図)がわからないと、空論になっちゃいそうですね。
class1のプログラムマーと、class2のプログラマーは、完全に別の方なのでしょうか? この場合、class1のプログラマーがMethod1を「いじってくれるなよ」という意図の下でprivateにしたならば、本来、class2のプログラマーはMethod1の存在自体気付かないはずですし、上述のTH01さんのご指摘の動作となることがclass1のプログラマーの意図するところだと思います。一方で、class2のプログラマーがたまたま同じMethod1という名前を使ったとしても障害は出ません。
class1とclass2を同じ人がプログラムしているとして、Method1を外部に公開したくなく(publicにしたくなく)、かつoverrideしたいのであれば、class1のMethod1をprotectedにすれば良いわけです。
-
あくまで可能性の話なので、やはり質問者の方が明確にして頂けない限りは分かりません。
外池 さんからの引用 class1のプログラムマーと、class2のプログラマーは、完全に別の方なのでしょうか? この場合、class1のプログラマーがMethod1を「いじってくれるなよ」という意図の下でprivateにしたならば、本来、class2のプログラマーはMethod1の存在自体気付かないはずですし、上述のTH01さんのご指摘の動作となることがclass1のプログラマーの意図するところだと思います。
ソースはあるけど、既に使っているところがあるから、(派生クラスでoverrideしない限り影響のなさそうなvirtual/protectedの追加であっても)書き換えたくはない。(もしくは書き換えるなと上司に言われる)
しかし、このクラスでだけはどうしても変えたいんだ。
(別の型にすると、キャストできなくて困るとか?)
前提としてはちょっと無理ありすぎですかね。
そんなルールがあれば、何とか説得して曲げてしまいたいところです。
-
じゃんぬねっと さんからの引用 本当に Overwrite に近い言葉の響きからか誤解している人が多いのですよ。
(2, 3 人見かけたことがあります)投稿する前、念のために override と overwrite の違いについて調べていたのですが、よくわかりませんでした。
私もカウントに入れておいてください…。
改めて検索して調べたところ、Ruby という言語では、元のクラスとは別に、それと同じクラス名で同じメソッドを再度定義すると、それが元クラスのメソッドの上書きになるそうでした。
また、メソッドポインタを書き換えることのできる言語もありそうでした。
じゃんぬねっとさんの仰っている overwrite とは、これらのイメージに近いのですね?
そして、VB でもそのようなことができればよいと元質問者さんが思われている可能性を、じゃんぬねっとさんは考慮されたということですね。
そうでしたら失礼しました。
もしかすると class2 は class1 から派生すらしていないという可能性も、今となっては考えたりしてます(^^; 最初見たときは少し頭をよぎったのですが、そんなことはありえないと思うことにしてました。
経験上、そういった思い込みが問題解決を遅らせてしまったりすることが多々あります…。
外池 さんからの引用 うーん、こうなると、元質問者さんの置かれている状況(元質問者さんの意図)がわからないと、空論になっちゃいそうですね。 最初の外池さんの返信までに、たぶん元質問者さんはもう諦められているのではと想像してます(^^;
class1 の変更ができるのでしたら、おそらく最初にされているだろうと思いますが、存在や詳細仕様(利用者にとって不都合なもの)がわかっていても、それを直接修正することはできない(しづらい)という場面はよくあることではないでしょうか(空論中…)。外池 さんからの引用 一方で、class2のプログラマーがたまたま同じMethod1という名前を使ったとしても障害は出ません。 元質問者さんは class1 の Method1 が呼ばれることがまずいと書かれているので、class2 で Method1 という名前のメソッドが問題なく定義できることは関係ないのではと思います。
本当に細かなことばかり書いて、すみません。
直接的な回答ばかり考えていましたが、外池さんの仰る通り、class1 の Method1 が変更できれば解決しますね。