いつもお世話になっております。
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ランキング
-
オブジェクト型の変数が定義さ...
-
クラス内にWin32APIのコールバ...
-
C# panel内のコントロールの使...
-
CreateObjectとはどういう意味...
-
デザイナ時のエラー「オブジェ...
-
c# nullは空集合として扱かって...
-
FriendとPublicの違い。。。
-
既定のコンストラクタがない?
-
ダイアログ表示時にチェックボ...
-
MFCのCListCtrlでスクロールを検出
-
MFCのドラッグ&ドロップについて
-
【C++】相互参照
-
イベントにAddHandlerされてい...
-
(UWSC) 「#32770」の意味わかり...
-
OnInitDialog()の関数の組み込み方
-
ConsoleApplicationから別プロ...
-
privateなメンバ関数をテストす...
-
継承を重ねた場合のコストはど...
-
【ASP.NET】 独自で作成したク...
-
このコンパイルエラーの意味に...
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
CreateObjectとはどういう意味...
-
オブジェクト型の変数が定義さ...
-
ボタンを押すとラベルの文字を...
-
C# panel内のコントロールの使...
-
コンストラクタ内でのthisポインタ
-
クラス内にWin32APIのコールバ...
-
メモリリークが発生するのはど...
-
【VC++6.0(MFC)】「Out of memo...
-
関数で値渡しと参照渡しではど...
-
オブジェクトをどこでdisposeす...
-
C++の連想配列の使い方
-
すべてのページにServer.Create...
-
VB6では、Applicationは未定義...
-
チュートリアル : オブジェクト...
-
SetとNothingの存在意味?
-
Visual studio c# android オブ...
-
【VC++.NET】コンストラクタと...
-
C#でExcelを起動したい
-
ゆかりネットで東北ずん子exを...
-
ADODB.Connectionはインターフ...
おすすめ情報