2010-02-09 3 views
-1

Comment puis-je forcer un objet à être appelé uniquement via son interface? Cela peut seulement accomplir via le modificateur d'accès mais en C# ne peut pas faire.Forcer un objet à être appelé via son interface

je:

public interface IProfile { string GetName(); } 
public class Profile : IProfile { 
    public string GetName() { return "Linh"; } 
} 

J'ai une section de code comme celui ci-dessus. Je l'ai mis dans une bibliothèque de classe après que je génère un assemblage.

Dans un projet Web, certains programmeurs ajouteront une référence à cet assembly. S'ils veulent appeler la classe profil, ils doivent alors utiliser l'interface IPROFILE comme déclaration ci-dessous:

IProfile ip = new Profile(); 
ip.GetName(); 

Mais certains programmeurs imprudents ne le fera pas. Ils utiliseront ci-dessous ainsi:

Profile pr = new Profile(); 
pr.GetName(); 
+0

J'écris une bibliothèque de classes et les programmeurs vont appeler certains objets dans cette interface via l'objet. Mais je pense que cela ne peut pas accomplir en C# – Linh

+0

Linh: S'il vous plaît écrire une version pseudo-code de ce que vous voulez faire. Ce n'est pas très clair. –

+0

Quels problèmes rencontrez-vous? –

Répondre

3

Ceci est vraiment simple. Utilisez une implémentation d'interface explicite:

public interface IProfile { string GetName(); } 
public class Profile : IProfile 
{ 
    string IProfile.GetName() { return "Linh"; } 
} 

GetName peut maintenant être appelé par une référence d'interface.

+0

+1. Cela devrait être la réponse acceptée. –

+0

@Moron Excep qu'elle ne sera pas acceptée de toute façon –

+1

Vrai :-(Existe-t-il un moyen pour les utilisateurs avec suffisamment de rep pour accepter une réponse? Peut-être que nous devrions avoir une fonction de réponse "secondaire" acceptée marque) qui sera automatiquement acceptée après peut-être un mois, si l'affiche de la question ne se soucie pas d'en marquer un. –

0

Si la question veut « Comment forcer l'appel des méthodes interfacés seulement? », La réponse pourrait être: « Faire le reste des méthodes privées »

2

Vous Je veux adopter une approche d'usine, comme ça:

using System; 

using Ext; 

namespace ConsoleApplication26 
{ 
    class Program 
    { 
     static void Main(string[] args) 
     { 
      IFoo foo = FooFactory.GetFoo(); 
     } 
    } 
} 


// another project/dll 

namespace Ext 
{ 
    public interface IFoo 
    { 
     void M(); 
    } 


    public static class FooFactory 
    { 
     public static IFoo GetFoo() 
     { 
      return new Foo(); 
     } 
    } 


    class Foo : IFoo 
    { 
     public void M() { } 
    } 
} 
+0

@Silky: comment cela empêche-t-il d'appeler la méthode M directement? –

+0

Vous devriez probablement protéger le constructeur pour Foo, afin que seules les autres classes du module puissent y accéder.(Je ne suis pas un programmeur C# donc je ne sais pas quel est le niveau d'accès approprié pour cela.) EDIT: whoops, n'a pas vu qu'il n'y a pas de modificateur "public" sur la classe Foo. –

+0

John: Re son commentaire, j'ai déduit qu'il voulait que les gens ne spécifient pas le type sur le côté gauche (Peut-être que j'ai mal compris). Le seul moyen de le faire est de ne pas donner accès au type sous-jacent (comme dans une usine). Son titre de sujet était assez trompeur. –

Questions connexes