2009-06-05 4 views
2

Laissez-moi vous expliquer. J'ai défini une interface nommée IEmployee (propriétés ID, Prénom et Nom) mais je n'ai pas encore implémenté cette interface dans aucune classe.Est-il possible d'instancier une nouvelle instance d'une interface dans VB.NET?

Ce que je veux faire est quelque chose comme:

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

Call SomeFunction (User) 

Le complier VB.NET ne semble pas comme ça.

EDIT ** Merci à tous, tous les bons points bien faits! Je vais instancier une classe concrète. J'essayais juste de prendre un raccourci :)

Répondre

8

Non, ce ne serait pas. Vous ne pouvez pas créer directement des instances d'interfaces comme celles-ci: que voulez-vous que les appels de propriétés fassent? Les appels de propriété appellent du code, mais vous n'avez pas fourni d'implémentation. Supposons que vous définissiez une méthode dans l'interface pour calculer l'allocation de vacances de l'employé: que voulez-vous que cela fasse si vous l'appelez, lorsque vous n'avez pas implémenté l'interface n'importe où?

Le but d'une interface est de spécifier une API qui est ensuite implémentée dans des classes concrètes - vous ne pouvez pas utiliser l'interface sans que quelque chose l'implémente correctement.

(Notez que je pense qu'il ya des situations vraiment bizarres où le compilateur C# et peut-être le VB un va vous permettent d'instancier interfaces directement, mais je pense qu'ils sont des situations COM spécifiques. Je suppose que ce ISN Il y a aussi des choses comme RealProxy qui implémentent des interfaces dynamiquement, etc., mais je ne pense pas que cela soit directement pertinent.)

+0

autant que les interfaces utilisées comme DTO (juste propriété/field carriers) ce serait incroyablement utile, je ne sais pas si RealProxy, ou Marc's Proxy le ferait, mais LinFu semble certainement le faire, ou peut-être magie dans AutoMapper. De toute façon, je suis capable de générer une instance d'une interface en utilisant AutoMapper qui semble s'appuyer sur LinFu pour ce travail. – Maslow

1

Non. Une interface est juste un contrat entre une classe qui l'implémente et le reste du monde. Quand le code parle d'une interface, il s'agit vraiment d'un morceau de code concret qui a «signé» ce contrat. Tout comme l'employé qui signe un contrat de travail le lie à ce qu'il peut faire, la mise en œuvre d'une interface lie la classe. Vous ne pouvez pas placer le document de contrat devant un écran pour taper à la place de l'humain, et vous ne pouvez pas demander à une interface d'exécuter une fonctionnalité.

Vous devrez choisir une implémentation concrète et l'instancier.

0

Vous devez vraiment implémenter l'interface avant de pouvoir l'utiliser. Une interface est juste une description de la façon dont un objet peut agir - vous ne pouvez pas interagir avec une description, vous avez vraiment besoin d'une implémentation concrète qui se trouve derrière.

0

Interfaces sont des définitions de ce que les classes devraient ressembler et donc n'avez pas de code mis en œuvre mais si youreally veulent Vous pouvez utiliser moqueur, qui sous les couvertures crée une classe proxy qui implémente l'interface de sorte que vous pouvez l'appeler,

Depuis l'élément est une interface et par définition n'a pas de mise en œuvre de son généralement une bonne idée de définir les attentes pour chaque propriété/méthode

http://ayende.com/Blog/archive/2008/06/29/Rhino-Mocks-3.5-Release-Candidate.aspx est le lien

2

Il y a très peu de choses vous pouvez utilement faire avec une interface sans une implémentation concrète. Vous certainement ne peut rien créer ...

La seule façon utile que j'ai trouvé est (avec Expression) exprimant l'intention, par exemple avec RPC:

(côté)

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

Ce dit si nous avions un ISomeService instance "svc" (ce que nous ne faisons pas), alors nous appellerions SomeMethod passant en 3; nous pouvons alors tirer le Expression à part pour le découvrir.

Dans tous les autres scénarios - si vous ne disposez d'aucune implémentation concrète au moment de la compilation ou de l'exécution (génération de type dynamique), cela ne sert à rien.

+0

en ce qui concerne les interfaces utilisées comme DTO (juste propriété/champ transporteurs) ce serait très utile, je ne sais pas si Proxy, ou RealProxy de Jon le ferait, mais LinFu semble certainement faire cela, ou peut-être c'est un peu magique AutoMapper. De toute façon, je suis capable de générer une instance d'une interface en utilisant AutoMapper qui semble s'appuyer sur LinFu pour ce travail. – Maslow

0

LinFu semble être capable de le faire. Il générera un type en utilisant Reflection.Emit qui accepterait vos valeurs d'échantillon. Mais la mise en œuvre de la méthode si l'interface a des méthodes et que vous souhaitez qu'elle fonctionne, vous devrez la faire de la même manière que dans les propriétés/champs.

0

Java a une classe anonyous. Vous pouvez instancier des interfaces comme un raccourci comme vous voulez ..., mais ce n'est pas une véritable instanciation interace. Vous créez une classe anonyous (une classe sans nom) et cette classe implémente l'interface que vous voulez. En Java, il sera comme ça:

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

Et maintenant, dans le code que vous voulez instancier l'interface:

publique void main() {

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()); 

}

Je pense que cette capacité est incroyable! À mon avis, VB.Net a beaucoup plus de capacités cool que Java, mais dans celui-ci, Java est incroyable!

+0

est-il un moyen d'y parvenir en vb? – Error404

Questions connexes