2010-08-21 4 views
0

Je voudrais utiliser le même code pour copier des fichiers sur un serveur FTP et via USB. J'ai déjà écrit du code, qui utilise maintenant des fonctions de l'espace de noms System.IO. Pour minimiser la duplication de code, j'ai énuméré les fonctions dont j'ai besoin de l'espace de noms system.IO, et je pensais à concevoir une interface exposant des fonctions similaires, puis deux classes, une pour les opérations de fichiers FTP, et un pour les locaux.Interfaces dans .Net

J'ai quelques questions au sujet des interfaces bien:

  1. pourrait concevoir mon interface afin que le File.* et Directory.* organisation soit préservée (de sorte que les routines déclarées dans l'interface suivent la même hiérarchie que dans l'espace de noms IO) ?
  2. Existe-t-il un moyen, pour les opérations locales, de mapper simplement les fonctions de l'espace de noms IO aux fonctions d'interface correspondantes (en écrivant quelque chose comme Sub IO.File.Delete Implements IOInterface.File_Delete)?
  3. Puis-je déclarer quelque chose comme Dim IOHandler As IOInterface, en supposant que IOInterface est le nom de mon interface? Puis-je écrire à la fois IOHandler = New LocalIOHandler et IOHandler = New FTPIOHandler, en supposant que LocalIOHandler et FTPIOHandler sont mes deux classes implémentant le IOInterface?

Merci!
CFP.

Répondre

1

Vous ne pouvez pas modifier une classe existante pour implémenter votre propre interface. Vous pouvez cependant concevoir votre propre interface où vos méthodes renvoient des classes qui existent déjà, comme celles de l'espace de noms System.IO.

Vous pouvez également implémenter votre propre classe qui enveloppe les classes System.IO afin que vos cartes IOInterface.Delete à un FileInfo.Delete (s'il vous plaît pardonnez la syntaxe C#, VB est mon rouillé):

public class MyFileClass : IOInterface 
{ 
    public void DeleteFile(string fileName) 
    { 
    new FileInfo(fileName).Delete(); 
    } 
} 

En réponse à # 3: Oui. Une variable de type IOInterface peut contenir tout type qui implémente cette interface. Vous pouvez également le lancer plus tard vers le type spécifique si nécessaire.

+1

Bien que cela ne soit pas incorrect, le downcast doit être évité et avoir une odeur. –

+0

D'accord, mais parfois, il est nécessaire et il est important de savoir que l'objet stocké est toujours du type d'implémentation non seulement du type d'interface. –

+0

Alors les gens me disent :) mais ils sont aussi presque tous de bons exemples de quand. Cela dit je pense que vous aviez raison de mentionner la possibilité ici car il semble que je suis très nouveau à –

1

Je ne peux pas vous aider avec le premier je n'obtiens simplement pas ce que vous voulez dire avec la fonction hierachi mais pour les deux autres. Non, il n'y a pas de syntaxe pour cela, vous devrez implémenter une méthode qui transmet l'appel à la méthode. Par exemple. (Pseudo morue que je ne l'ai pas écrit VB pendant des années)

Sub open(path as string) 
    Begin 
    Return File.Open path 
    End 

Pour votre 3ème vous pourriez dire que c'est le point (ce n'est pas le seul point) des interfaces que le code consommation n'a pas besoin de connaître le type de béton

+0

Je voulais dire que dans mon interface je définirais le besoin d'avoir des espaces de noms enfants, fichiers et répertoires, qui pourraient contenir les fonctions respectivement supprimer, créer, etc; un fichier ou un répertoire, comme dans l'espace de noms IO. –

+0

Une interface réside dans un espace de noms mais ne peut spécifier aucune limitation à laquelle réside la classe de déclaration d'espace de noms.D'autres fichiers et répertoires sont _classes_ dans l'espace de noms System.IO. –

+0

Y a-t-il un moyen d'avoir des sous-classes dans un répertoire? –