2009-11-08 10 views
1

quelqu'un peut aider, j'ai un petit problème, j'ai une interface et également une interface de base, lorsque je tente de faireC#: Héritage et IDisposable - question étrange

.Dispose() 

Il ne trouve pas la méthode comme il est implémenté sur ma sous-classe NOT base .. et il semble toujours vouloir appeler la base - même si j'ai spécifiquement mis l'espace de noms devant le paramètre sur le constructeur.

Voici un peu de code pour l'expliquer, il y a fondamentalement 2 IhouseRepository (interfaces), 1 est l'interface de base et l'une est l'interface de la sous-classe.

Dans le constructeur j'ai spécifiquement dit son MarkSmith.Data (et non MarkSmith.DataBase) mais il continue à ramasser la version de DataBase où Dispose n'est pas implémenté.

Mon idée était d'implémenter IDisposable dans toutes les sous-classes et il devrait y avoir la responsabilité d'éliminer.

Dans le constructeur j'ai mis une seule ligne qui appelle le IhouseRepository et je "CAN" accès Dispose - donc ça marche - Pourquoi ça marche ici pas sur le param passé au constructeur est un mystère :-)

mais le constructeur sur le param semble forcer l'espace de noms DataBase et non des données

Je suppose que je pourrais renommer toutes mes interfaces sur le projet de base à IHouseRepositoryBase mais je ne comprends pas pourquoi cela se passe.

Toute aide vraiment apprécié

public class HouseService : ServiceBase.HouseService, IHouseService 
{ 
    public HouseService(MarkSmith.Data.IHouseRepository repository) 
     : base(repository) 
    { 

     MarkSmith.Data.IHouseRepository test = 
      new MarkSmith.Data.HouseRepository(new MyDataContext); 
     test.Dispose(); // THIS WORKS! NO PROBLEMS 
    } 

    // Dispose() calls Dispose(true) 
    public void Dispose() 
    { 
     Dispose(true); 
     GC.SuppressFinalize(this); 
    } 


    protected virtual void Dispose(bool disposing) 
    { 
     if (disposing) 
     { 
      // free managed resources 
      if (repository != null) 
      { 
       repository.Dispose(); // THIS FAILS .. IT IS CALLING NS DATABASE 
      } 
     } 
+1

Je dois admettre que je n'ai pas bien compris votre question. Est-ce que IHouseRepository dérive de IDisposable? Si non, pourquoi pas? – Heinzi

+0

Votre code a également besoin d'un nettoyage général, à mon avis (les meilleures pratiques recommandent généralement contre les sous-classes). J'ai du mal à suivre ce que tu as fait. Où avez-vous implémenté IDisposable? – senfo

+0

Qu'est-ce que "IT IS CALLING NS DATABASE" signifie? – cdiggins

Répondre

4

Ne votre méthode Dispose() surchargé besoin d'être virtual pour que les sous-classes peuvent passer outre sa mise en œuvre? Sinon, la méthode qui finira par être appelée dépendra de l'interface à laquelle vous l'appelez.

De même, si toutes les sous-classes doivent implémenter IDisposable, la classe de base doit également implémenter IDisposable, ce qui entraîne l'application du compilateur.

+0

Thnaks daniel, je suis un peu confus .. de toute façon avec votre suggestion son fonctionnement .. Fondamentalement, ma classe de base héritent de IDisposable mais sont mis en œuvre en tant qu'abstract .. et puis dans la sous-classe ceux-ci sont overriden .. Maintenant tout fonctionne! –

1

Si vous avez suivi le modèle recommandé, votre méthode Dispose dans HouseRepository n'est pas virtuelle. Cela signifie que celui qui sera appelé est un temps de compilation déterminé statiquement basé sur le type de la variable que vous utilisez pour y accéder - pas sur le type de l'instance dans la variable.

Ceci est juste des considérations générales, mais c'est aussi loin que je peux aller parce que dans votre exemple de code la définition de membre pour le référentiel n'est pas présente.