いつもお世話になっております。
C#で特定のDBに接続するクラスを作ろうとADODB.Connection(ADO.Conn)を継承しようとしたところADO.Connはインターフェイスであるため、各メンバの実装をしなくてはなりません。ADO.Connはオブジェクトととしてインスタンスを生成できていたため、なぜインターフェイスがインスタンスを生成してオブジェクトとして使えるのかがわかりません(Excel.Applicationなども同様です)。
これはどのような仕組みになっているのでしょうか?
A 回答 (2件)
- 最新から表示
- 回答順に表示
No.2
- 回答日時:
>ADO.Connはリファレンスなどではインターフェイスと
どこをご覧になったのでしょう?
MSDNではオブジェクトとなっています。
http://msdn.microsoft.com/ja-jp/library/cc364251 …
この回答への補足
ご返答ありがとうございます。
「リファレンスなどでは」というのは誤りでした。リファレンスでは確かに
オブジェクトとして説明がありますが、Visual StudioでADO.Connはインターフェイス
としてインテリセンスには表示され、継承して子クラスを作ることはできません。
インターフェイスとして実装出来るだけです。
No.1
- 回答日時:
インターフェースというのは「共通の型」
くらいの意味で、オブジェクトの実体では
ありません。
例えば、CONインターフェースがopen、
closeというメソッドを定義している場合は
CONを実装するオブジェクトは必ずopenと
closeというメソッドを持たなければいけ
ないことになっています。具体的にどんな
やり方になるかは相手DBにより色々と
あるでしょうが、使う方はそういうことは
考えずに済むようになっています。
例えば、CONインターフェースを実装する
OracleX、とMySQLXがあるとします。
同じような処理をするメソッドxxxを考える
時、xxx(OracleX param)と書いてしまうと
MySQLX型のオブジェクトを指定して、この
xxxを呼び出せません。xxx(CON param)と
すればOracleX型の引数もMySQLX型の
引数も扱えます。paramは定義された
openやcloseなどのメソッドを使うことが
できますね。これはCON型の変数には
必ずopenやcloseというメソッドを持つ
ことになっているからです。
だから、インターフェースはインスタンスを
生成できません。単なる定義だけだから
です。
インターフェースを実装したオブジェクトは
インスタンスを生成できます。
また、インスタンスは生成できませんが、
両方の型のオブジェクトを代入できます。
OracleX aaa = new OracleX();
MySQLX bbb = new MySQLX();
CON ccc;
ccc = aaa; //これOKです。
ccc = bbb; //これもOKです。
ccc = new CON(); //これはNGです。
>インターフェイスがインスタンスを生成して
これは何かの勘違いでしょう。
この回答への補足
ご返答ありがとうございます。
質問の内容の具体的な例を申しますと
ADO.Connはリファレンスなどではインターフェイスと説明されていますが、
利用するときには
var dbCon = new ADODB.Connection();
でインスタンスが生成でき
dbCon.Open()やdbCon.Closeなどのメソッドやプロパティを使うことができます。
インターフェイスなので継承ではなく、実装しなければならないのはわかりますが、
上記のようになぜ普通のクラスのようにインスタンスを生成でき利用できるのかが
わかりません。
お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!
似たような質問が見つかりました
- Java 複数TBLのオブジェクトを1つの変数(オブジェクト)でまとめて管理したい 1 2022/12/17 00:12
- C言語・C++・C# このプログラミング誰か教えてくれませんか 1 2022/05/21 02:41
- Wi-Fi・無線LAN PCWi-Fiの設定方法がわからなくて困っています。 4 2022/12/28 18:30
- Visual Basic(VBA) データベースから絞り込んでデータを読み込み 1 2023/02/21 19:51
- MySQL AWSのRDSを無料枠で使用しておりますが、2日前にDBインスタンスを作成し、現在確認したらDBイン 1 2022/07/19 23:49
- その他(開発・運用・管理) PLCアダプター 4 2023/02/23 13:15
- その他(プログラミング・Web制作) どういうプログラムで組みますか?google colabでやってるんですけど、出来る方お願いします。 1 2022/07/17 18:41
- PostgreSQL ポストグレにあるExcelファイルを開くには 1 2022/12/13 18:07
- 邦楽 次のアーティストのうち、10代に刺さる順に挙げてください。 5 2023/06/01 20:07
- Visual Basic(VBA) access count数を変数に格納 2 2022/03/30 19:21
関連するカテゴリからQ&Aを探す
おすすめ情報
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
オブジェクト型の変数が定義さ...
-
CreateObjectとはどういう意味...
-
【VC++6.0(MFC)】「Out of memo...
-
UMLでの「オブジェクト」と「イ...
-
C#でのコンパイル時のエラー
-
FriendとPublicの違い。。。
-
エディットコントロールでEnter...
-
(UWSC) 「#32770」の意味わかり...
-
C++/CLIからC++の呼び出しで例外
-
VB.NETで、DLLを頂いたんですが...
-
【ASP.NET】 独自で作成したク...
-
ダイアログ表示時にチェックボ...
-
クラスのアドレスを引数として...
-
CMainFrameクラスの使い方
-
C#のクラス設計について教えて...
-
ボタンのオーナードローについて
-
MFC モードレスDlgについて
-
IncludeではなくClassで宣言す...
-
VC++ リストボックスにデータを...
-
フォーム間でのオブジェクト又...
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
CreateObjectとはどういう意味...
-
オブジェクト型の変数が定義さ...
-
コンストラクタ内でのthisポインタ
-
メモリリークが発生するのはど...
-
ボタンを押すとラベルの文字を...
-
クラス内にWin32APIのコールバ...
-
関数で値渡しと参照渡しではど...
-
SetとNothingの存在意味?
-
VB6では、Applicationは未定義...
-
オブジェクトをどこでdisposeす...
-
C# panel内のコントロールの使...
-
メモリ解放について、ご教授く...
-
Visual studio c# android オブ...
-
イベントドリブンとオブジェク...
-
すべてのページにServer.Create...
-
最小化したフォームを元に戻す
-
クラスの設定について
-
ADODB.Connectionはインターフ...
-
【VC++6.0(MFC)】「Out of memo...
-
デザイナ時のエラー「オブジェ...
おすすめ情報