Question

Étant donné que les interfaces sont également utilisées pour l'aide d'informations cacher, donnant à l'utilisateur un sous-ensemble des méthodes possibles, ils sont autorisés à utiliser, et, disons, j'ai un Person de classe IPerson et interface.

dans le principal, je suis autorisé à faire

IPerson testy = new Person();

ou

Person testy = new Person();

Alors, vraiment, je ne suis pas interdit d'utiliser encore personne. Alors, comment l'interface véritablement cacher des données?

Était-ce utile?

La solution

Interfaces ne sont pas utilisés à quoi que ce soit « cacher » en soi. Il est utilisé pour établir un contrat entre l'appelant et la mise en œuvre. Cette promesse de contrat que « ces méthodes et propriétés seront ici, et ils ne changeront pas ».

Interfaces ouvre également la belle possibilité de faire varier la mise en œuvre sans que l'appelant d'avoir à faire face. Cela est essentiel dans la conception découplées.

Votre question implique que votre main veut pour tout savoir sur la classe Person. Ce que vous obtenez est alors le code couplé en fait, ce qui est plus difficile à tester. Pour « réparer » ce que vous devez changer votre état d'esprit et de penser: main faire veulent pas pour tout savoir sur Person, il est seulement intéressé par IPerson et ne nécessite que l'interface. Pas plus, pas moins.

Autres conseils

Votre malentendu vient de ce qui entend par « information cacher ». Qu'est-ce qui vous entendu cela signifiait que de la mise en œuvre d'une interface permet à une classe de séparer ses méthodes face à l'avant de ses implémentations internes.

Il est également appelé « encapsulation », et l'avantage de celui-ci est de permettre au concepteur de changer sans perturber le code existant des mécanismes internes d'un objet qui a été écrit dans l'interface publique est tout, ce qui rend plus facile de changer les choses. Ainsi, vous entendrez souvent les interfaces décrites comme un « contrat », car il crée un accord implicite entre les utilisateurs et les exécutants d'une classe que ses méthodes orientées vers l'avant restent conformes. Et parce que plusieurs classes peuvent implémenter une interface unique, un composant peut être facilement remplacé par un autre, tant qu'il implémente la même interface publique. Grady Booch, l'auteur d'un livre très respecté sur la conception orientée objet, définit l'encapsulation comme suit:

  

le processus de compartimenter les éléments d'une abstraction qui constituent sa structure et son comportement; encapsulation sert à séparer l'interface contractuelle d'une abstraction et sa mise en œuvre.

Il ne faut pas que le consommateur d'un objet sait ou être exposé à la façon dont le concepteur de cet objet mis en œuvre ses fonctionnalités sous les couvertures. Pensez à votre micro-ondes: tout ce que vous devez faire pour utiliser un micro-ondes pour faire une collation est d'appuyer sur quelques boutons sur le devant. C'est le interface publique de votre micro-ondes. Il ne faut pas comprendre les principes scientifiques qui sont derrière sa conception juste pour faire un sac de pop-corn. L'avantage pour les interfaces ici est qu'ils réduisent la complexité et le rendre plus facile pour les autres développeurs de faire usage de vos classes.

Alors, en faisant référence à l'exemple donné dans votre question, vous n'êtes pas censé être interdit d'utiliser la classe Person, mais vous pourriez être limité dans les méthodes exposées par cette classe que vous êtes en mesure d'accéder. Par exemple, la classe Person peut stocker les noms d'une personne en interne dans les champs de FirstName et LastName séparés, mais seulement exposer publiquement une propriété de Name qui retourne la concaténation de ces deux champs de nom privé.

Mais la conception orientée objet et de la terminologie est assez compliquée. Je recommande fortement que vous recherchez un bon livre sur les concepts et le lire attentivement. Vous serez un meilleur programmeur à cause de cela.

Que faire si vous n'avez pas cette classe Person.

 Object obj = loadObject();

 if(obj is IPerson) {

  IPerson person = (IPerson) obj;

 } 

ou

  IPerson person = loadPerson();

Le ne-pas-tout-autre-fondamentalement but d'interfaces en .net est de fournir une forme limitée d'héritage multiple. Avoir un Hériter de classe d'une autre classe a deux objectifs orthogonales:

  1. Cela signifie que les champs, méthodes et propriétés de la classe de base qui servira adéquatement aux besoins de la classe dérivée peuvent être utilisés par la classe dérivée sans avoir à être respecified.
  2. Cela signifie que le code qui prévoit des méthodes de la classe de base peut automatiquement avec les méthodes de la classe dérivée.

Il est impossible pour une classe en .net pour faire implicitement l'utilisation des membres de plus de classe de base, mais il est possible pour une classe pour mettre en œuvre de nombreuses interfaces et substituable pour l'un d'eux. Par exemple, un dictionnaire et une liste chaînée n'ont pas beaucoup en commun, mais ils peuvent tous deux être dénombrés. Un port série et un ListBox n'ont pas beaucoup en commun, mais ils peuvent tous deux être mis au rebut.

Presque tout ce que les interfaces peuvent faire, peut se faire aussi bien ou mieux avec les classes de base abstraites. Les interfaces une chose peuvent faire les classes de base ne peuvent pas se permettre une forme limitée d'héritage multiple.

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top