3

私がこれを考えすぎているかどうかはわかりませんが、過去に、クラスを宣言するときに次のようなことをしました:

IMyService myService = new MyService();

ジャンプするmyServiceと、IMyServiceインターフェイスに移動します。

ただし、次のことを行うと (明らかに) に移動しますMyService

var myService = new MyService();

どちらが「正しい」使用法と見なされますか、またはこれは「お気に入りのアイスクリームのフレーバーは何ですか?」の別の例です。?

最も関連性の高い質問を見てきましたが、実際には私のシナリオには答えていません。

4

5 に答える 5

2

このオプションもあります...

var myService = new MyService() as IMyService;

これにより、 var myVar = IMyService タイプが作成されます...その後、他のコードで次のようなことができます...

if(myVar is MyService)
{
    //instance specific stuff 
}
于 2011-09-27T08:47:57.123 に答える
1

まあ、それは異なります。あなたのMyServiceクラスのすべてのパブリックメンバーは(排他的に)IMyServiceインターフェースの実装から来ていますか?または、いくつかの追加のパブリックメンバーがありますか(おそらく別のインターフェイスの実装から)?その場合、2番目の「フレーバー」ではこれらの追加メンバーを表示できますが、最初の「フレーバー」では表示されません。

一方、インターフェースを使用している場合、「正しい」使用法は、依存性注入エンジンまたはある種のファクトリクラスまたはメソッドから型インスタンスを取得することだと思いますが、それはこの質問の範囲外だと思います。

于 2011-09-27T08:40:10.877 に答える
1

あなたはどのタイプになりたいmyServiceですか?参考にしたいのIMyServiceか、MyService参考にしたいのか。その決定を下したら、残りは続きます。

つまり、質問に答えられるのはあなただけです。

于 2011-09-27T08:44:30.857 に答える
0

それはあなたが正しい使用法によって何を意味するかによります。インターフェイスを使用した例では、クラスのオブジェクトを作成し、MyServiceそれをクラスの「ポインタ」に格納していますIMyService。したがって、オブジェクトiusは実際にはのインスタンスですMyServiceが、 varはそれをインターフェイスmyServiceとして扱います。IMyServiceしたがって、にないメソッドを呼び出したり、プロパティにアクセスしたりすることMyServiceはできませんIMyService

サンプルでは、​​宣言の右側から変数varの型を計算するようにコンパイラーに指示しているだけです。myServiceしたがって、この場合は、とまったく同じです。MyService myServiceつまり、myService変数を介してMyServiceクラスのすべてのパブリックメソッドとプロパティにアクセスできます。

于 2011-09-27T08:42:45.690 に答える
-1

本当の問題は、なぜ myService をインターフェースとして定義するのかということだと思います。他の IMyService をそれに割り当てることができない限り、あまり役に立ちません。その場合、それをインターフェースとして定義する必要があります。

于 2011-09-27T08:46:23.757 に答える