DOBON.NET DOBON.NETプログラミング掲示板過去ログ

VBのMe/MyClassをC#で

環境/言語:[WinXP(and Vista)/.NET2.0(C#)]
分類:[.NET]

こんにちわ

VBのMeとMyClassの違いを理解している人間です。
この違いと使い分けを理解してると、ライブラリを作るときなんか柔軟性があって便利ですよね。

これをC#でもやりたいのですが、自分を示すキーワードがthisしかありません。
このthisは「素なら自クラスの、継承先で上書きされてるなら継承先の」メンバを参照するものだと思いますが
「上書きされても常に上書き前の自クラスの」メンバを見たい場合はどうするのでしょうか?

※あるいはthisの認識が逆かもしれません


ご教示お願いいたします
MyClass は baseですね。

MSDN
http://msdn.microsoft.com/ja-jp/library/zwkz3536.aspx
Me と MyClass の違いは

Me = 自インスタンスを参照する
MyClass = 自クラスを参照する

と考えた方がいいように思えます。

つまり・・・Me はインスタンスが生成されてないと参照できませんが、
MyClass はインスタンスが生成されてなくても参照可能です。


>「上書きされても常に上書き前の自クラスの」メンバを見たい場合

これはどういうケースで使うんでしょうか?
クラス設計そのものに何か問題があるような気がしますが・・・
  • 題名: Re[2]: VBのMe/MyClassをC#で
  • 著者: 魔界の仮面弁士
  • 日時: 2009/09/15 18:14:45
  • ID: 25416
  • この記事の返信元:
  • この記事への返信:
    • (なし)
  • ツリーを表示
2009/09/15(Tue) 18:27:33 編集(投稿者)

■No25414に返信(Blueさんの記事)
> MyClass は baseですね。
base は MyBase ではありませんか? MyClass では無いと思いますよ。

> MSDN
> http://msdn.microsoft.com/ja-jp/library/zwkz3536.aspx
『現在のオブジェクトにおける仮想メソッドの非仮想呼び出し』という行を見ると、
「VB = MyClass」「C# = 適用なし」になっていますね。


以下、参考までに。
http://www.atmarkit.co.jp/bbs/phpBB/viewtopic.php?topic=40767&forum=7
  • 題名: Re[2]: VBのMe/MyClassをC#で
  • 著者: よねKEN
  • 日時: 2009/09/15 18:19:33
  • ID: 25417
  • この記事の返信元:
  • この記事への返信:
    • (なし)
  • ツリーを表示
2009/09/15(Tue) 18:21:48 編集(投稿者)

■No25413に返信(月夜見命さんの記事)
> これをC#でもやりたいのですが、自分を示すキーワードがthisしかありません。

その通りです。C#には対応するキーワードはありません。

> 「上書きされても常に上書き前の自クラスの」メンバを見たい場合はどうするのでしょうか?

オーバーライド可能なメソッドはその定義通り、
実装が派生クラスでオーバライドされうるものです。

基底クラスの内部処理でオーバーライド可能なメソッドを呼び出すのであれば、
派生クラスでメソッドがオーバーライドされることを前提として、
そのメソッドの実装に依存しないように考慮する必要があります。

それが嫌なら(実装に依存するのであれば)、
基底クラスの内部処理で呼び出すメソッドは、
オーバーライド可能にしなければいいだけです。
基底クラスのprivateなメソッドとして定義しましょう。

■MyClassとは・・・
例えば、基底クラスにメソッドA(オーバーライド可能)とメソッドB(オーバーライド不可)があって、まったく同じ実装だったとしましょう。
基底クラスの内部処理でこれらの機能(オーバーライドされて動作は変更されたくない)を呼び出したい場合・・・

・C#であれば、基底クラスの内部処理で呼び出すのは、メソッドBを呼び出せばOKです。

・VBであれば、上記のC#での方法を取る以外に、「メソッドBを削除し、基底クラスの内部処理でMyClassを使ってメソッドAを呼び出す」方法を取ることもできます。

つまり、MyClassは同一の実装であるが、オーバライド可能としたい場面とオーバーライドされたくない場面が発生する場合に、同じ実装のメソッドを複数用意することを回避できる、というだけです。

#ぶっちゃけそういう場面は思いつかないんですけどね。
質問者の本題と外れてしまうかもしれませんが、
皆さんは MyClass をどういう場面で使います?

ワタシ的には、オーバーロードしたコンストラクタ内から既定コンストラクタを

MyClass.New()

と呼び出すか、もしくはクラスメソッドを呼び出すことくらいしか
使い道があまり考えられないのですが・・・
>base は MyBase ではありませんか? MyClass では無いと思いますよ。
すみません、ボケてました。
  • 題名: Re[4]: VBのMe/MyClassをC#で
  • 著者: 月夜見命
  • 日時: 2009/09/16 16:26:24
  • ID: 25423
  • この記事の返信元:
  • この記事への返信:
    • (なし)
  • ツリーを表示
しばらく見れないうちにレスが大量、ありがとうございます


「実装はprivateで作っておいて、それを単純に呼び出すだけの
 オーバーライド可能なメソッドを作っておく」
が最適解なのかな

わかりやすい例とかぱっとは出てこないんですが、過去に1度だけ必要とする状況がありました。
ただ、ケースとしてはまさに極稀で、しかもたぶん他の実装方法もあったかもなので
設計が悪い可能性も大きくあります
(考える時間もなくとにかくコード記述量減らしたかったのかも。当時の設計思想がもうわからないです^^;)


本題は解決したので解決済みをつけておきますが
MyClass活用法はあればコメントください

ありがとうございました
解決済み!

DOBON.NET | プログラミング道 | プログラミング掲示板