Que fait "implements" sur une classe?


Si une classe implémente une autre classe... Qu'est-ce que ça veut dire? J'ai trouvé cet exemple de code: http://www.java2s.com/Code/Php/Class/extendsandimplement.htm

Mais malheureusement, il n'a aucune explication avec lui...

Author: Webnet, 2010-12-30

7 answers

Implements signifie qu'il prend le comportement désigné que l'interface spécifie. Considérez l'interface suivante:

public interface ISpeak
{
   public String talk();
}

public class Dog implements ISpeak
{
   public String talk()
   {
        return "bark!";
   }
}

public class Cat implements ISpeak
{
    public String talk()
    {
        return "meow!";
    }
}

Les classes Cat et Dog implémentent l'interface ISpeak.

Ce qui est génial avec les interfaces, c'est que nous pouvons maintenant nous référer aux instances de cette classe via l'interface ISpeak. Prenons l'exemple suivant:

  Dog dog = new Dog();
  Cat cat = new Cat();

  List<ISpeak> animalsThatTalk = new ArrayList<ISpeak>();

  animalsThatTalk.add(dog);
  animalsThatTalk.add(cat);

  for (ISpeak ispeak : animalsThatTalk)
  {
      System.out.println(ispeak.talk());
  }

La sortie de cette boucle serait:

Aboie!
meow!

L'interface

Fournit un moyen d'interagir avec les classes de manière générique en fonction des choses qu'elles font sans exposer ce que sont les classes d'implémentation.

L'Une des interfaces les plus communes utilisées en Java, par exemple, est Comparable. Si votre objet implémente cette interface, vous pouvez écrire une implémentation que les consommateurs peuvent utiliser pour trier vos objets.

Par exemple:

public class Person implements Comparable<Person>
{
  private String firstName;
  private String lastName;

  // Getters/Setters

  public int compareTo(Person p)
  {
    return this.lastName.compareTo(p.getLastName());  
  }
}

Considérons maintenant ceci code:

//  Some code in other class

List<Person> people = getPeopleList();

Collections.sort(people);

Ce que ce code a fait était de fournir un ordre naturel à la classe Person. Parce que nous avons implémenté l'interface Comparable, nous avons pu tirer parti de la méthode Collections.sort() pour trier nos List d'objets Person par son ordre naturel, dans ce cas, par nom de famille.

 101
Author: Wayne Hartman, 2010-12-29 22:07:10

Vous devriez regarder dans les interfaces de Java. Une recherche rapide sur Google a révélé cette page, qui semble plutôt bonne.

J'aime penser à un interface comme une "promesse" de toutes sortes: Toute classe qui l'implémente a un certain comportement que l'on peut en attendre, et donc vous pouvez mettre une instance d'une classe d'implémentation dans une référence de type interface.

Un exemple simple est l'interface java.lang.Comparable. En implémentant toutes les méthodes de cette interface dans votre propre classe, vous êtes affirmant que vos objets sont "comparables" les uns aux autres et peuvent être partiellement commandés.

L'implémentation d'une interface nécessite deux étapes:

  1. Déclarer que l'interface est implémentée dans la déclaration de classe
  2. Fournir des définitions pour TOUTES les méthodes qui font partie de l'interface.

L'interface java.lang.Comparable n'a qu'une seule méthode, public int compareTo(Object other). Vous devez donc fournir cette méthode.

Voici un exemple. Étant donné cette classe RationalNumber:

public class RationalNumber
{
    public int numerator;
    public int denominator;

    public RationalNumber(int num, int den)
    {
        this.numerator = num;
        this.denominator = den;
    }
}

(Note: C'est généralement une mauvaise pratique en Java d'avoir des champs publics, mais j'ai l'intention que ce soit un type de données très simple, donc je ne me soucie pas des champs publics!)

Si je veux pouvoir comparer deux instances RationalNumber (à des fins de tri, peut-être?), je peux le faire en implémentant l'interface java.lang.Comparable. Pour ce faire, deux choses doivent être faites: donner une définition de compareTo et déclarer que l'interface est implémentée.

Voici comment le la classe étoffée pourrait ressembler à:

public class RationalNumber implements java.lang.Comparable
{
    public int numerator;
    public int denominator;

    public RationalNumber(int num, int den)
    {
        this.numerator = num;
        this.denominator = den;
    }

    public int compareTo(Object other)
    {
        if (other == null || !(other instanceof RationalNumber))
        {
            return -1; // Put this object before non-RationalNumber objects
        }

        RationalNumber r = (RationalNumber)other;

        // Do the calculations by cross-multiplying. This isn't really important to
        // the answer, but the point is we're comparing the two rational numbers.
        // And no, I don't care if it's mathematically inaccurate.

        int myTotal = this.numerator * other.denominator;
        int theirTotal = other.numerator * this.denominator;

        if (myTotal < theirTotal) return -1;
        if (myTotal > theirTotal) return 1;
        return 0;
    }
}

Vous pensez probablement, quel était le but de tout cela? La réponse est quand vous regardez des méthodes commethis : des algorithmes de tri qui attendent juste "une sorte d'objet comparable". (Notez l'exigence que tous les objets doivent implémenter java.lang.Comparable!) Cette méthode peut prendre des listes de TOUT type d'objets comparables, qu'ils soient Strings ou Integers ou RationalNumbers.

REMARQUE: J'utilise les pratiques de Java 1.4 dans cette réponse. java.lang.Comparable est maintenant un générique interface, mais je n'ai pas le temps d'expliquer les génériques.

 6
Author: Platinum Azure, 2010-12-29 22:07:34

Les interfaces sont implémentées via des classes. Ce sont des classes purement abstraites, si vous voulez.

En PHP lorsqu'une classe implémente à partir d'une interface, les méthodes définies dans l'interface doivent être strictement suivies. Lorsqu'une classe hérite d'une classe parente, les paramètres de la méthode peuvent être modifiés. Ce n'est pas le cas pour les interfaces:

interface ImplementMeStrictly {
   public function foo($a, $b);
}

class Obedient implements ImplementMeStrictly {
   public function foo($a, $b, $c) 
      {
      }
}

Provoquera une erreur, car l'interface n'a pas été implémentée comme défini. Considérant:

class InheritMeLoosely {
   public function foo($a)
      {
      }
}

class IDoWhateverWithFoo extends InheritMeLoosely {
   public function foo()
      {
      }
}

Est autorisé.

 2
Author: Linus Kleen, 2010-12-29 21:44:57

Une interface peut être considérée comme une simple liste de définitions de méthodes (sans corps). Si une classe veutimplémenter et interface, elle conclut un contrat, disant qu'elle fournira une implémentation pour toutes les méthodes répertoriées dans l'interface. Pour plus d'informations, voir http://download.oracle.com/javase/tutorial/java/concepts/

 2
Author: mfonda, 2010-12-29 21:47:01

En Java, une classe peut implémenter une interface. Voir http://en.wikipedia.org/wiki/Interface_ (Java ) pour plus de détails. Pas sûr au sujet de PHP.

J'espère que cela aide.

 0
Author: cjstehno, 2010-12-29 21:45:14

Une interface définit un contrat simple de méthodes que toutes les classes d'implémentation doivent implémenter. Lorsqu'une classe implémente une interface, elle doit fournir des implémentations pour toutes ses méthodes.

Je suppose que l'affiche suppose un certain niveau de connaissance de la langue.

 0
Author: Peter Lawrey, 2010-12-29 21:45:24

C'est ce qu'on appelle une interface. De nombreuses langues OO ont cette fonctionnalité. Vous voudrez peut-être lire l'explication php ici: http://de2.php.net/interface

 0
Author: FlorianH, 2010-12-29 21:45:48