2017-10-07 2 views
-1

J'ai appris sur les interfaces et ma question est la suivante: Par exemple, j'ai une classe Car nommé: Car qui implémente une interface nommée: ICarsignature des membres des paramètres d'interface

public class Car: ICar 

Les deux Car et ICar ont un Save méthode:

public bool Save(Car car) 
    {some save logic} 

Si la méthode Save, passez la méthode Car ou ICar, ce qui est une meilleure pratique, ou n'est-ce pas important? Je pensais ICar, parce que si cette interface est héritée par une autre classe cela fonctionnera toujours.

Appréciez toute direction, merci.

+2

La méthode 'save' une partie de l'interface' ICar'? Pourquoi passer une autre instance de 'ICar' alors? – orhtej2

+0

@ orhtej2 Bon point. J'ai supprimé ICar car il n'est pas nécessaire car j'ai déjà l'instance en cours. Merci de votre aide. –

Répondre

2

Pensez-y de cette façon: si ICar attend un Car comme paramètre, ICar serait selon explicitement Car, tandis que le découplage est ce qui voulait lorsque vous utilisez des interfaces.

Si ICar dépend Car:

public interface ICar 
{ 
    void Save(Car car); 
} 

public class Car : ICar 
{ 
    public void Save(Car car) { } 
} 

public class Van : ICar 
{ 
    // Here Van needs to have a Car object, why should it? 
    public void Save(Car car) { } 
} 

Si Car ont été dépréciée (par exemple, jugé trop générique), vous auriez besoin de refactoriser votre code entier.

Au lieu de cela, si ICar dépend ICar:

public interface ICar 
{ 
    void Save(ICar car); 
} 

public class Car : ICar 
{ 
    public void Save(ICar car) { } 
} 

public class Van : ICar 
{ 
    public void Save(ICar car) { } 
} 

Ici, il n'a vraiment pas du tout si Car existe ou non, vous n'êtes pas couplé à sa mise en œuvre.

Cependant, puisque ICar, lorsqu'il est implémenté, serait déjà un ICar, vous n'avez pas besoin de le passer en paramètre.

Tenir compte:

public interface ICar 
{ 
    // Will save myself 
    void Save(); 
} 

Versus:

public interface ICar 
{ 
    // Will save some ICar 
    void Save(ICar car); 
} 
+0

Il y a une erreur de compilation. public interface ICar {void Enregistrer (ICar voiture);} public class Voiture: ICar {public void Enregistrer (voiture de voiture) {}} – selami

+0

@selami A été distrait, corrigé. –

+0

@CamiloTerevinto Parfaitement expliqué et exactement ce que je cherchais, merci. –