2009-06-05 21 views
2

説明しましょう。 IEmployee(ID、FirstName、およびSurnameプロパティ)という名前のインターフェイスを定義しましたが、まだそのインターフェイスをどのクラスにも実装していません。 VB.NETのコンパイラはこれを好きなようには見えませんVB.NETでインターフェイスの新しいインスタンスをインスタンス化することは可能ですか

Dim User as New IEmployee 
User.ID = 1 
User.FirstName = "" 
User.Surname = "" 

Call SomeFunction (User) 

:私は何をしたいか

は次のようなものです。

編集**ありがとうございました。私は具体的なクラスをインスタンス化します。私はちょうどショートカットを取ろうとしていた:

答えて

8

いいえ、そうではありません。このようなインターフェースのインスタンスを直接作成することはできません。プロパティ呼び出しはコードを呼び出しますが、実装は提供していません。従業員の休暇手当を計算するためのインタフェースのメソッドを定義するとします。呼び出された場合、インターフェイスをどこにも実装していない場合、何をすると思われますか?

インターフェイスのポイントは、具体的なクラスで実装されるAPIを指定することです。インターフェイスを正しく実装することなくインターフェイスを使用することはできません。

(私は、C#コンパイラとおそらくVBの1つであるになると、インターフェイスを直接インスタンス化することができますが、COM固有の状況だと思います。 COMとは関係ありません。RealProxyのようなインターフェイスも動的に実装されていますが、直接関係するとは限りません。)

+0

私はRealProxyやMarcのプロキシがそれをするのかどうかわかりませんが、LinFuは確かにこれをやっているようですが、オートマッパーの魔法。いずれにしても、私はLinFuに依存しているようなAutoMapperを使ってインターフェースのインスタンスを生成することができます。 – Maslow

1

いいえインターフェイスはそれを実装するクラスとの間の契約に過ぎません。世界の残りの部分。コードがインタフェースについて語るとき、それは実際に契約書に「署名」している具体的なコードについて話しています。従業員が雇用契約書に署名するのと同じように、雇用契約を実行してできることに拘束するので、インタフェースを実装することでクラスが拘束されます。あなたは、人間の代わりに入力するための画面の前に契約書類を置くことはできませんし、インターフェイスに機能を実行するように要求することはできません。

具体的な実装を選んでインスタンス化する必要があります。

0

インターフェイスを実際に使用する前に実装する必要があります。インターフェースとは、オブジェクトがどのように動作するかを記述したものにすぎません。記述とやりとりすることはできません。具体的な実装が必要です。

0

インタフェースはカバーの下に、あなたはそれを呼び出すことができるようにインタフェースを実装するプロキシクラスを作成します

クラスは次のようになり、したがって、任意のコードの実装を持っていけないが、youreally をしたい場合は、モックを使うことができすべきかの定義は、あります

項目がインタフェースであると定義による一切の実装を持っていないその通常各プロパティ/メソッド

http://ayende.com/Blog/archive/2008/06/29/Rhino-Mocks-3.5-Release-Candidate.aspx の期待を設定することをお勧めリンク

2

あるので、非常にいくつかありますあなたは、具体的な実装をしなくてもインターフェイスを使って便利に行うことができます。あなた確かには何も作成できません...

私が見つけた唯一の有効な方法は、RPCと、たとえば、意図を表現(Expressionで)です:

(わき)

new Proxy<ISomeService>().Invoke(svc => svc.SomeMethod(123)); 

これは、私たちがISomeServiceを持っていた場合語りますインスタンス "svc"(これはありません)の場合は、SomeMethodを3に渡します。これを見つけるためにExpressionを引き離すことができます。

他のすべてのシナリオで - コンパイル時または実行時(動的型生成)のいずれかで具体的な実装がない場合は、まったく使用されません。

+0

インターフェイスとしてDTOs(プロパティ/フィールドキャリア)として使用される限り、これは信じられないほど役に立つだろう、私はプロキシ、またはジョンのRealProxyがそれを行うかどうかわからないが、LinFuは確かにこれを行うか、おそらくそれはいくつかの魔法ですオートマッパー。いずれにしても、私はLinFuに依存しているようなAutoMapperを使ってインターフェースのインスタンスを生成することができます。 – Maslow

0

LinFuがこれを行うことができるようです。 サンプル値を受け入れるReflection.Emitを使用して型を生成します。しかし、メソッドが実装されていてメソッドが実装されていて、それらを機能させたい場合は、メソッドの実装は、プロパティ/フィールドの入力と同じ方法で行わなければなりません。

0

Javaにはanonyousクラスがあります。あなたは、あなたが望むようなショートカットとしてインターフェイスをインスタンス化することができます...しかし、実際のインターインスタンスのインスタンス化ではありません。あなたはanonyousクラス(名前のないクラス)を作成し、そのクラスは必要なインターフェイスを実装します。 Javaでは、それはそのようになります:

public interface Emp{ 
    public String getName(); 
    public void setName(x as String); 
} 

そして今、コードでは、インターフェイスをインスタンス化したい:

メインます。public void(){

Emp e = new Emp(){ 
    // interface implementation comes here: 

    private String name; 

    public String getName(){ 
     return this.name; 
    } 

    public void setName(x as String){ 
     this.name = x; 
    } 
} 

e.setName("jackson"); 
System.out.println(e.getName()); 

}

私はこの能力が驚異的だと思います!私の意見では、VB.NetにはJavaよりはるかにクールな能力がありますが、この中でJavaは素晴らしいです!

+0

VBでこれを達成する方法はありますか? – Error404

関連する問題