web-dev-qa-db-fra.com

Que fait «implémente» sur une classe?

Si une classe implémente une autre classe ... qu'est-ce que cela signifie? J'ai trouvé cet exemple de code: http://www.Java2s.com/Code/Php/Class/extendsandimplement.htm

Mais malheureusement, cela n'a aucune explication ...

31
Webnet

Implements signifie qu'il prend le comportement désigné spécifié par l'interface. 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 désormais faire référence 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:

écorce!
Miaou!

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

Par exemple, l'une des interfaces les plus courantes utilisées en Java 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érez maintenant ce 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 utiliser la méthode Collections.sort() pour trier nos List de Person objets par son ordre naturel, dans ce cas, par nom de famille.

106
Wayne Hartman

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

J'aime à penser à un interface comme une sorte de "promesse": 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 interface- référence de type.

Un exemple simple est l'interface Java.lang.Comparable. En implémentant toutes les méthodes de cette interface dans votre propre classe, vous prétendez que vos objets sont "comparables" les uns aux autres et peuvent être partiellement ordonné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 Ne contient 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;
    }
}

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

Si je veux pouvoir comparer deux instances de 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: fournir une définition pour compareTo et déclarer que l'interface est implémentée.

Voici à quoi pourrait ressembler la classe étoffée:

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 l'intérêt de tout cela? La réponse est quand vous regardez des méthodes comme this : 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 N'IMPORTE QUEL type d'objets comparables, qu'ils soient Strings ou Integers ou RationalNumbers.

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

6
Platinum Azure

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

Dans PHP lorsqu'une classe implémente à partir d'une interface, les méthodes définies dans cette 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éfinie. Tandis que:

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

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

Est autorisée.

2
Linus Kleen

Une interface peut être considérée comme une simple liste de définitions de méthodes (sans aucun corps). Si une classe veut implémenter et s'interfacer, elle conclut un contrat, en 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
mfonda

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

J'espère que cela t'aides.

0
cjstehno

Une interface définit un simple contrat 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
Peter Lawrey

Cela s'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
FlorianH