- ベストアンサー
ラッパークラスってインヘリタンス(継承)を使ったクラスのこと?
「それならラッパーを使えばいいよ。」っていうのをよく目にします。 ラッパー(包み込む)とは、クラスをクラスで包むということですよね? インヘリタンスのことですよね?違いますか???
- みんなの回答 (3)
- 専門家の回答
質問者が選んだベストアンサー
> System.IO.Streamクラスに読み取りの機能を付けるのにSystem.IO.StreamReaderクラスでラッパーするわけですよね??? > この認識は合っていますか? 私は合っていると思います。 # 言葉の定義次第なので,違うという人が出てくるかもしれませんが。
その他の回答 (2)
- Yune-Kichi
- ベストアンサー率74% (465/626)
> .NET FrameworkのStreamに対するStreamReaderやStreamWriterのソースって見れますか? ここあたりからダウンロードできます。 MS: .NET Framework Libraries http://referencesource.microsoft.com/netframework.aspx VS2008 Professional以上 かつ .NET Framework 3.5 (SP1なし) なら, @IT: Visual Studio 2008で見る.NET Frameworkのソースコード http://www.atmarkit.co.jp/fdotnet/insiderseye/20080222sourcecode/sourcecode.html などを参考にすると,ステップイン可能です。 # うかつに.NET Framework SP1入れるとステップインできません。が,重要な更新として来ているので普通は入れてしまうという……。 ただし,上記のコードは原則として C# です。 まぁ,VB とは原則的に読み替えるだけなので,その面において難しいことはないですが。 > 実はインターフェース型がわかりません。 Interface はまさしくインターフェイス,外部から可能な操作の集合を定めたものです。 必要になった場合に Interface を実装する方法は知っていないと困りますが, 型を提供する側 (自分への提供を含む) として使用するための,理論的な背景は継承とか抽象クラスとかがわかってからでよいと思います。 個人的には, ・単体のクラス (Object 型のみを継承) ・共通のクラス (MustInherit なしのクラス,継承に使われる) ・抽象クラス (MustInherit つきのクラス,単独では実体化できない) ・インターフェイス の順 (下に行くほど) に抽象度が上がってくると思います。 そのため,クラスライブラリを自分で作っていると,上の方から順にわかってくると思います。 私の過去のインターフェイスの提供を思い返すと, ・IXXXable系 (○○できる,ということを示す型) ・アドインやプラグインといった機構で使う (System.AddIns や,リフレクションを使った独自実装) ・他のインターフェイスの戻り値やプロパティの型 が主です。 # 2番目の理由の派生で,プラグイン化可能までいっていないようなものでも使っていることがありますが。 > 本を何冊も読んでいるのに、ライブラリにあるインターフェース型の使い方がわからないでいます。 クラスライブラリのインターフェイス型を実装するのは, ・必要に迫られて (別のクラス/インターフェイスで利用しているから) ・便利な構文を別途使うため (System.Collections.IEnumerable とか System.IDisposable とか System.Runtime.Serialization.ISerializable とか) ・なんらかの目的でまったく関係ないクラスで統一感を出したい (System.IDisposable とか System.ICloneable とか) が主な目的になると思います。 > Streamクラスがラッパークラスで、StreamReaderやStreamWriterはインターフェースクラスという認識でいいですか? StreamReader や StreamWriter がラッパークラスです。 根本的に存在するのが System.IO.Stream クラスです。 それを内部に持って,文字列の入出力に特化したのが System.IO.StreamReader クラスや System.IO.StreamWriter クラスになります。 # つまり,Stream を StreamReader / StreamWriter が「ラップする (包む)」のです。 ちなみに,System.IO.StreamWriter まわりを GoF の Adapter パターンとして見ると, ・Target クラス : System.IO.TextWriter クラス ・Adaptee クラス : System.IO.Stream クラス ・Adapter クラス : System.IO.StreamWriter クラス になります。 # Client クラスはユーザー作成クラスなので省略。
お礼
ありがとうございます。 AクラスがあってBクラスがラッパーだとしたら、 AクラスにBクラスの機能を付けることだと思っています。 System.IO.Streamクラスに読み取りの機能を付けるのにSystem.IO.StreamReaderクラスでラッパーするわけですよね??? この認識は合っていますか? Available Source Code Componentsをダウンロードしました!ありがとうございます。 VS2005なのではやくVS2010が出てそのデバッグをやってみたいです。
- Yune-Kichi
- ベストアンサー率74% (465/626)
継承ではない,というか,継承とは限りません。 元のクラスを使いやすくする為の薄皮のことを,ラッパークラスといいます。 たとえば,.NET Frameworkにおいて,Streamに対するStreamReaderやStreamWriterが相当します。 上記の例ではラッパークラスがラップされるクラスを持つことによって実現されています。 もちろん,可能であるならばラッパークラスがラップされるクラスを継承してもよいです。 AdapterとかProxyとかのパターンでできる「新しいクラス」が,ラッパークラスと呼ばれることが多いような気がします。 # GoF本で別名にWrapperがあったのはAdapterとDecorator
お礼
ありがとうございます。 .NET FrameworkのStreamに対するStreamReaderやStreamWriterのソースって見れますか? GoF本を読みました。 AdapterとDecoratorもインターフェース型を実装します。 実はインターフェース型がわかりません。 本を何冊も読んでいるのに、ライブラリにあるインターフェース型の使い方がわからないでいます。 クラスを装飾するのがインターフェイスクラスだと認識しました。 Streamクラスがラッパークラスで、StreamReaderやStreamWriterはインターフェースクラスという認識でいいですか?
お礼
ありがとうございます。 この質問は締め切りたいと思います。 ありがとうございました!