プロが教える店舗&オフィスのセキュリティ対策術

いつもお世話になっております。
C#で特定のDBに接続するクラスを作ろうとADODB.Connection(ADO.Conn)を継承しようとしたところADO.Connはインターフェイスであるため、各メンバの実装をしなくてはなりません。ADO.Connはオブジェクトととしてインスタンスを生成できていたため、なぜインターフェイスがインスタンスを生成してオブジェクトとして使えるのかがわかりません(Excel.Applicationなども同様です)。
これはどのような仕組みになっているのでしょうか?

A 回答 (2件)

>ADO.Connはリファレンスなどではインターフェイスと


どこをご覧になったのでしょう?
MSDNではオブジェクトとなっています。
http://msdn.microsoft.com/ja-jp/library/cc364251 …

この回答への補足

ご返答ありがとうございます。
「リファレンスなどでは」というのは誤りでした。リファレンスでは確かに
オブジェクトとして説明がありますが、Visual StudioでADO.Connはインターフェイス
としてインテリセンスには表示され、継承して子クラスを作ることはできません。
インターフェイスとして実装出来るだけです。

補足日時:2012/09/19 21:22
    • good
    • 0

インターフェースというのは「共通の型」


くらいの意味で、オブジェクトの実体では
ありません。
例えば、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などのメソッドやプロパティを使うことができます。
インターフェイスなので継承ではなく、実装しなければならないのはわかりますが、
上記のようになぜ普通のクラスのようにインスタンスを生成でき利用できるのかが
わかりません。

補足日時:2012/09/15 13:56
    • good
    • 0

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!