none
privateメソッドを overrideしたい RRS feed

  • 質問

  •  

    みなさん こんにちわ。 未熟者と申します。

     

    基本的なことなのかもしれませんが、 違うクラスのprivateメソッドを overrideしたいのですが できますか?

     

    class1.vbの内容

     

    public class class1

    Private Sub Method1()

     

    End Sub

    End Class

     

     

    class2.vb で class1のMethod1を overrideしたいのですが できるでしょうか?

     

    ご教授 お願いします。

     

     

     

     

     

     

     

     

     

    2008年6月9日 8:20

すべての返信

  • 派生クラスに公開していないものを override というのは前提からおかしいような気がします。
    override をする必要がないですよね。 ひょっとして override を何か誤解しているのでしょうか?

    2008年6月9日 10:32
  • じゃんぬねっと様

     

    ご返答ありがとうございます。

     

    確かに派生クラスに公開していないので、overrideできないとは 思っていたのですが、何かしら 方法があるのではと。

     

    どうしても、Method1メソッドが呼ばれるのが、まずかったので、違うクラスでMethod1を書き換えたんです。

     

    見当違いの発言をしてしまい、申し訳ありませんでした。

     

    また 宜しくお願いいたします。

    2008年6月9日 12:11
  •  未熟者 さんからの引用

    確かに派生クラスに公開していないので、overrideできないとは 思っていたのですが、何かしら 方法があるのではと。

    どうしても、Method1メソッドが呼ばれるのが、まずかったので、違うクラスでMethod1を書き換えたんです。

    基本的には無理でしょう。

    この場合は似たようなクラスを再実装するしかないのではなかろうかとも思えますが、現状の抽象的な話ではなんとも言いかねます。

     

     未熟者 さんからの引用

    見当違いの発言をしてしまい、申し訳ありませんでした。

    その辺は気にしなくて良いかと。

    ただ、質問する際はどのような目的があってそれをやりたいのかを明確にしておくと良いかもしれません。

    (もちろん、解決できるかどうかはその命題次第です)

    2008年6月9日 13:27
    モデレータ
  • 外池と申します。

     

    元クラスでPrivateなメンバーは、派生クラスでは「無いも同然」なので、同じ名前のメンバーを(再度)定義してやってOKだと思いますよ? 

     

    「無いも同然」なので、Overrideという考え方をする必要もなく・・・、上述のとおり「再度」とは言っても、新たに定義しているのも同然かと思います。

     

     

     

    2008年6月16日 5:33
  • override (乗り越えて定義) と overwrite (上書き) を誤解しているのだと脳内置換して答えていました。

    2008年6月16日 10:08
  •  外池 さんからの引用
    元クラスで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 内のバグを回避する目的で、前にそうしたことがあります…。

    2008年6月16日 13:26
  • 私も下記の発言から、オーバーライドしたいという風に認識しています。

     

     未熟者 さんからの引用

    どうしても、Method1メソッドが呼ばれるのが、まずかったので、違うクラスでMethod1を書き換えたんです。

     

    Class1のMethod1メソッドを呼ばれないようにするためには、Method1自体を差し替える(オーバーライド)するか、Method1を呼ぶメソッド・プロパティを呼ばないようにするか(代わりのものを実装する)かと考えています。

    そして前者が残念ながら実現不可能なため、後者を検討することになるかなと。

    2008年6月16日 14:01
    モデレータ
  •  TH01 さんからの引用

    これって、VB のキーワードの Overrides と Shadows にそれぞれ対応するのでしょうか。

    使い分けが難しそうな表現ですね(^^;

     

    いいえ、違います。 それなら Shadows か new という表現をしますが、私は Overwrite と書いています。
    本当に Overwrite に近い言葉の響きからか誤解している人が多いのですよ。
    (2, 3 人見かけたことがあります)

    2008年6月16日 16:32
  •  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にすれば良いわけです。

    2008年6月18日 0:24
  • あくまで可能性の話なので、やはり質問者の方が明確にして頂けない限りは分かりません。

     

     外池 さんからの引用

    class1のプログラムマーと、class2のプログラマーは、完全に別の方なのでしょうか? この場合、class1のプログラマーがMethod1を「いじってくれるなよ」という意図の下でprivateにしたならば、本来、class2のプログラマーはMethod1の存在自体気付かないはずですし、上述のTH01さんのご指摘の動作となることがclass1のプログラマーの意図するところだと思います。

    ソースはあるけど、既に使っているところがあるから、(派生クラスでoverrideしない限り影響のなさそうなvirtual/protectedの追加であっても)書き換えたくはない。(もしくは書き換えるなと上司に言われる)

    しかし、このクラスでだけはどうしても変えたいんだ。

    (別の型にすると、キャストできなくて困るとか?)

     

    前提としてはちょっと無理ありすぎですかね。

    そんなルールがあれば、何とか説得して曲げてしまいたいところです。

    2008年6月18日 13:54
    モデレータ
  •  じゃんぬねっと さんからの引用
    本当に Overwrite に近い言葉の響きからか誤解している人が多いのですよ。
    (2, 3 人見かけたことがあります)

    投稿する前、念のために override と overwrite の違いについて調べていたのですが、よくわかりませんでした。

    私もカウントに入れておいてください…。

     

    改めて検索して調べたところ、Ruby という言語では、元のクラスとは別に、それと同じクラス名で同じメソッドを再度定義すると、それが元クラスのメソッドの上書きになるそうでした。

    また、メソッドポインタを書き換えることのできる言語もありそうでした。

     

    じゃんぬねっとさんの仰っている overwrite とは、これらのイメージに近いのですね?

    そして、VB でもそのようなことができればよいと元質問者さんが思われている可能性を、じゃんぬねっとさんは考慮されたということですね。

    そうでしたら失礼しました。

    もしかすると class2 は class1 から派生すらしていないという可能性も、今となっては考えたりしてます(^^; 最初見たときは少し頭をよぎったのですが、そんなことはありえないと思うことにしてました。

    経験上、そういった思い込みが問題解決を遅らせてしまったりすることが多々あります…。

     

     外池 さんからの引用
    うーん、こうなると、元質問者さんの置かれている状況(元質問者さんの意図)がわからないと、空論になっちゃいそうですね。

    最初の外池さんの返信までに、たぶん元質問者さんはもう諦められているのではと想像してます(^^;
    class1 の変更ができるのでしたら、おそらく最初にされているだろうと思いますが、存在や詳細仕様(利用者にとって不都合なもの)がわかっていても、それを直接修正することはできない(しづらい)という場面はよくあることではないでしょうか(空論中…)。

     

     外池 さんからの引用
    一方で、class2のプログラマーがたまたま同じMethod1という名前を使ったとしても障害は出ません。

    元質問者さんは class1 の Method1 が呼ばれることがまずいと書かれているので、class2 で Method1 という名前のメソッドが問題なく定義できることは関係ないのではと思います。
    本当に細かなことばかり書いて、すみません。
    直接的な回答ばかり考えていましたが、外池さんの仰る通り、class1 の Method1 が変更できれば解決しますね。

    2008年6月18日 14:00