Classe (Informatique)

Classe (Informatique)

Classe (informatique)

Page d'aide sur l'homonymie Pour les articles homonymes, voir Classe.

En programmation orientée objet, une classe déclare des propriétés communes à un ensemble d'objets. La classe déclare des attributs représentant l'état des objets et des méthodes représentant leur comportement.

Une classe représente donc une catégorie d'objets. Il apparaît aussi comme un moule ou une usine à partir de laquelle il est possible de créer des objets. (C'est en quelque sorte une "boîte à outils" qui permet de fabriquer un objet). On parle alors d'un objet en tant qu'instance d'une classe (création d'un objet ayant les propriétés de la classe).

Il est possible de restreindre l'ensemble d'objets représenté par une classe A grâce à un mécanisme d'héritage. Dans ce cas, on crée une nouvelle classe B liée à la classe A et qui ajoute de nouvelles propriétés. Dans ce cas, différents termes sont utilisés :

  • A est une généralisation de B et B est une spécialisation de A,
  • A est une super-classe de B et B est une sous-classe de A,
  • A est la classe mère de B et B est une classe fille de A.

Sommaire

Exemples de classe

Dans les exemples ci-dessous est définie dans différents langages une classe Point avec deux attributs x et y. Cette classe contient un constructeur, deux méthodes retournant la valeur des attributs (getX() et getY()), une méthode déterminant si le point représente l'origine (isOrigin()) et une méthode effectuant une translation.

En C++

class Point {
  int x;
  int y;
 
public:
  Point(int x, int y) : x(x), y(y) {}
 
  int getX() const { return x; }
  int getY() const { return y; }
 
  bool isOrigin() const { return x == 0 && y == 0; }
 
  Point translate(const Point& point) const {
    return Point(x + point.x, y + point.y);
  }
};

En Java

public class Point {
  int x;
  int y;
 
  public Point(int x, int y) {
    this.x = x;
    this.y = y;
  }
 
  public int getX() { return x; }
  public int getY() { return y; }
 
  public boolean isOrigin() { return (x == 0) && (y == 0); }
  public Point translate(Point point) {
    return new Point(x + point.x, y + point.y);
  }
}

En Ruby

class Point
	attr_reader :x, :y
 
	def initialize(x, y)
		@x = x.to_i
		@y = y.to_i
	end
 
	def origin?
		@x.zero? and @y.zero?
	end
 
	def translate p
		 Point.new(@x + p.x, @y + p.y)
	end
end

En Pascal[Lequel ?]

type
  TPoint = class //définition du type class
  protected
    X, Y: integer;
  public
    constructor Point(X, Y: integer);
    function GetX: integer;
    function GetY: integer;
    function IsOrigin: Boolean;
    function Translate(Pt: TPoint): TPoint;
  end;
 
{La suite contient l'implémentation de la classe : en Pascal
il est nécessaire de faire une distinction claire entre
code et déclaration.}
 
constructor TPoint.Point(X, Y: integer);
begin
  Self.X := X; //ambigüité possible donc ajout de "Self."
  Self.Y := Y;
end;
 
function TPoint.GetX: integer;
begin
  Result := X;
end;
 
function TPoint.GetY: integer;
begin
  Result := Y;
end;
 
function TPoint.IsOrigin: Boolean;
begin
  Result := (X = 0) and (Y = 0);
end;
 
function TPoint.Translate(Pt: TPoint): TPoint;
begin
  Result := TPoint.Point(X + Pt.X, Y + Pt.Y);
end;

En Python

class Point:
  def __init__(self, x, y):
    self.x = x
    self.y = y
 
  def getX(self): return self.x
  def getY(self): return self.y
  def isOrigin(self):
    return (self.x == 0) and (self.y == 0)
  def translate(self, point):
    return Point(self.x + point.x, self.y + point.y)

En VB.Net

Public class Point
  protected x, y As Integer
 
  Public Sub New(ByVal x As Integer, ByVal y As Integer)
    me.x = x
    me.y = y
  End Sub
 
  Public Function getX As Integer
    return x
  End Function
 
  Public Function getY As Integer
    return y
  End Function
 
  Public Function isOrigine As Boolean
    If( x = 0 And y = 0)then
      return True
    Else
      return False
    End If
  End Function
 
  Public Function translate(ByVal p As Point) As Point
    return New Point(x + p.x, y + p.y)
  End Function

En Ada , depuis Ada95

package Point_Pack is
   -- une classe en Ada est un type dit "étiqueté"
   -- ici on décide en plus de cacher le contenu du type (partie privée)
   type Point is tagged private;
 
   -- les méthodes sont déclarées en dehors du type
   function Get_X (P : Point) return Integer;
   function Get_Y (P : Point) return Integer;
   function Is_Origin (P : Point) return Boolean;
   function Translate (P, Vector : Point) return Point;
 
   -- pas de constructeur "intégré"
   function New_Point (X, Y : Integer) return Point;
 
private
   -- définitions inaccessibles à l'utilisateur du type
   type Point is tagged record
      X, Y : Integer;
   end record;
end Point_Pack;
 
-- la suite contient l'implémentation de la classe: en Ada il est important de séparer 
-- le code (le corps) et les déclarations "visibles" (la spécification) :  en général dans 2 fichiers différents
package body Point_Pack is
-- les méthodes nomment explicitement l'objet en argument
   function Get_X (P : Point) return Integer is
   begin
      return P.X;
   end Get_X;
 
   function Get_Y (P : Point) return Integer is
   begin
      return P.Y;
   end Get_Y;
 
   function Is_Origin (P : Point) return Boolean is
   begin
      return P.X = 0 and then P.Y = 0;
   end Is_Origin;
 
   function Translate (P, Vector : Point) return Point is
   begin
      return Point'( X => P.X + Vector.X, Y => P.Y + Vector.Y );
   end Translate;
 
   function New_Point (X, Y : Integer) return Point is
   begin
      return Point'(X => X, Y => Y);
   end New_Point;
 
end Point_Pack;

Cas particuliers de classe

Classe immuable

Une classe est dite immuable s'il n'est pas possible de modifier un objet de cette classe après sa création. Par exemple, la classe Point, décrite ci-dessus dans différents langages, est immuable car elle n'expose aucune méthode permettant de modifier la valeur de ses variables membres. La méthode translate retourne un nouvel objet au lieu de modifier l'objet lui-même. La classe java.lang.String de l'environnement Java est un autre exemple de classe immuable, tout comme la classe System.String du Framework Microsoft .NET.

Classe abstraite

Dans certains langages, une classe peut être partiellement définie. En particulier, certaines méthodes de cette classe n'ont pas de corps ou d'implémentation. Ces méthodes sont dites « abstraites » (ou virtuelles en C++).

Les classes possédant au moins une méthode abstraite sont aussi dites classes abstraites (ou virtuelles) et ne peuvent pas être instanciées directement — sauf en créant une sous-classe non abstraite.

Exemple 
On souhaite modéliser les relations objets d'un dessin vectoriel. On peut dire qu'un objet dessin est un ensemble de géométries (la classe abstraite) et chaque géométrie peut être un point, un polygone ou une ligne brisée (ces trois classes héritent de géométrie). La classe abstraite n'est donc pas indispensable en soi, mais elle est indispensable[1] pour un modèle propre, générique et simplifié.

Le mixin est un cas particulier de classe abstraite. Il permet d'ajouter un service aux sous-classes.

Interface

Une classe ne possédant que des méthodes abstraites est appelée interface ou classe purement virtuelle (en C++) ou protocole (en Objective C).

Métaclasse

La classe d'une classe est une métaclasse. Les métaclasses permettent de réaliser de la réflexion structurelle.

Manipulation des données membres

Accès aux membres d'une classe

Une classe, comme définie précédemment, est un ensemble de membres typés (méthodes et attributs) qu'on est forcément amené à manipuler. Si p est une instance de Point(a,b)a et b sont de type int, on accède aux membres de p comme ceci :

  • p.x = a et p.y = b (accès aux attributs)
  • p.getX() et p.getY() (accès aux méthodes)

La question qui vient tout de suite à l'esprit est la suivante : pourquoi définir une méthode getX(), alors qu'on peut accéder directement aux champs x et y de la classe Point ?

En fait, lorsqu'on est amené à manipuler de nombreuses classes ainsi que de nombreuses relations entre ces classes (cf. héritage), le schéma, les données et les opérations peuvent devenir très complexes (surtout pour un individu n'ayant pas conçu le code). On a donc recours à un mécanisme qu'on appelle encapsulation des données, lequel se charge de masquer à certaines parties du programme les champs de la classe dans un souci d'intégrité. L'utilisateur est donc amené à ne manipuler que des méthodes qui ont été approuvées et qui en théorie remplissent bien leur rôle.

Selon le principe d'encapsulation, les méthodes ont un accès public - cela signifie que tout élément d'un programme peut utiliser une méthode. Quant aux attributs composant l'état, ils ont un accès privé (private) - seul l'objet lui-même (et donc les méthodes qu'il contient) a un accès direct à ses attributs. Dans ce cas, le seul moyen d'accéder à ces attributs est d'utiliser les méthodes de l'objet. Les attributs ne peuvent pas être utilisés directement par un autre élément du programme ni même un autre objet, même si cet objet est de la même classe. Autre point : tous les attributs d'un objet qui sont hérités sont directement accessibles par les autres membres de cet objet.

En ce qui concerne les dernières remarques, il y a souvent confusion sur la sémantique de l'accès privé. Le principe d'encapsulation implique une protection des attributs que nous appellerons verticale (seuls l'objet lui-même et les objets d'une sous-classe y ont accès). Nous retrouvons cette sémantique dans des langages comme Smalltalk, Oz ou OCaml. Cependant certains langages, comme C++, Pascal ou Java, plaident pour une protection des attributs que nous appellerons horizontale (les objets d'une même classe y ont accès, mais pas les objets des sous-classes).

Contrôle de l'accès aux membres d'une classe et visibilité

Certains langages proposent de changer le type d'accès des membres d'un objet. Cette opération s'effectue au sein des classes de ces objets. Par exemple, le C++ et le Pascal proposent les visibilités suivantes :

  • public : les membres peuvent être utilisés dans/et par n'importe quelle partie du programme (les méthodes définies de cette manière sont visibles et utilisables par l'utilisateur).
  • privé (private) : les membres privés d'une classe ne sont accessibles que par les objets de cette classe exactement et non par ceux d'une classe fille ou d'une autre classe.
  • protégé (protected) : comme les membres privés, mais ils peuvent être utilisés par les classes filles.

La sémantique de ces visibilités et leur nombre varient selon le langage. Par exemple, Java propose une définition un peu différente pour les membres protégés (elle s'étend à l'ensemble des objets de la même classe, des classes filles et des classes du même paquetage). Python propose aussi la possibilité de modifier la visibilité des membres d'une classe en préfixant le nom du membre par le caractère souligné ('_'). Par exemple, getX() est une méthode public, _getX() est seulement utilisable par les éléments du même module et __getX() est privé.

Surcharge d'opérateur

Article détaillé : Surcharge des opérateurs.

Lorsqu'on est amené à manipuler des données de même type (c'est par exemple le cas de points dans un repère), on peut vouloir appliquer à ces objets (au sens de la POO) des opérations. Ainsi, la fusion de deux zones (polygones) donne bien une nouvelle zone, tout comme l'addition de deux points donne un nouveau point.

  • Pour une addition de points, une première méthode consisterait à créer une méthode membre de la classe Point qu'on nommerait translate(Point) et qui renverrait un nouveau Point ayant subi l'addition. On a :
  ...
  p=Point(6,2)
  q=Point(6,3)
  m=Point(0,0)
  m=p.translate(q) // p+q 
  ...
  • En fait une notation plus naturelle et beaucoup plus simpliste serait de représenter l'addition tout simplement par m = p+q. Pour cela on utilise un mécanisme appelé surcharge d'opérateurs, qui redéfinit un opérateur donné pour une action donnée[2].

Continuons sur notre classe Point. L'exemple Python suivant est très parlant :

  class Point:
  (...)
    def __add__(self,point):                             # Surcharge de '+'
      return Point(self.x + point.x, self.y + point.y)

  p=Point(0,0)
  q=Point(2,3)
  r=p+q

Ainsi r.getX() retournera 2.

Notes et références

  1. On aurait très bien pu dire qu'un dessin vectoriel est un ensemble de polygones, de lignes et de points. Mais on s'aperçoit que, si on veut ajouter une géométrie plus complexe, il faut modifier la structure même de la classe mère, ce qui est ridicule.
  2. On peut bien évidemment surcharger l'opérateur '+' pour qu'il réalise autre chose que l'addition de Points. Cependant une multiplication de surcharges mal choisies contribuerait à alourdir le code et à le rendre illisible.

Voir aussi

  • Portail de la programmation informatique Portail de la programmation informatique
Ce document provient de « Classe (informatique) ».

Wikimedia Foundation. 2010.

Contenu soumis à la licence CC-BY-SA. Source : Article Classe (Informatique) de Wikipédia en français (auteurs)

Игры ⚽ Поможем решить контрольную работу

Regardez d'autres dictionnaires:

  • Classe (informatique) — Pour les articles homonymes, voir Classe. En programmation orientée objet, une classe déclare des propriétés communes à un ensemble d objets. La classe déclare des attributs représentant l état des objets et des méthodes représentant leur… …   Wikipédia en Français

  • Classe Java — Classe (informatique) Pour les articles homonymes, voir Classe. En programmation orientée objet, une classe déclare des propriétés communes à un ensemble d objets. La classe déclare des attributs représentant l état des objets et des méthodes… …   Wikipédia en Français

  • classe — ● n. f. ►OROBJ Description abstraite des données et du comportement d objets, ces objets étant similaires. Les représentants de la classe sont appelés des instances. (D après © Budd) …   Dictionnaire d'informatique francophone

  • Classe Préparatoire ATS — Classe préparatoire adaptation technicien supérieur Pour les articles homonymes, voir ATS. La classe préparatoire aux grandes écoles ATS (Adaptation Technicien Supérieur) a été créée pour les techniciens supérieurs issus de BTS ou d IUT,… …   Wikipédia en Français

  • Classe preparatoire ATS — Classe préparatoire adaptation technicien supérieur Pour les articles homonymes, voir ATS. La classe préparatoire aux grandes écoles ATS (Adaptation Technicien Supérieur) a été créée pour les techniciens supérieurs issus de BTS ou d IUT,… …   Wikipédia en Français

  • Classe préparatoire ATS — Classe préparatoire adaptation technicien supérieur Pour les articles homonymes, voir ATS. La classe préparatoire aux grandes écoles ATS (Adaptation Technicien Supérieur) a été créée pour les techniciens supérieurs issus de BTS ou d IUT,… …   Wikipédia en Français

  • Classe préparatoire ats — Classe préparatoire adaptation technicien supérieur Pour les articles homonymes, voir ATS. La classe préparatoire aux grandes écoles ATS (Adaptation Technicien Supérieur) a été créée pour les techniciens supérieurs issus de BTS ou d IUT,… …   Wikipédia en Français

  • Classe préparatoire d'adaptation pour technicien supérieur — Classe préparatoire adaptation technicien supérieur Pour les articles homonymes, voir ATS. La classe préparatoire aux grandes écoles ATS (Adaptation Technicien Supérieur) a été créée pour les techniciens supérieurs issus de BTS ou d IUT,… …   Wikipédia en Français

  • INFORMATIQUE ET SCIENCES HUMAINES - Art et informatique — L’utilisation d’ordinateurs pour des fins artistiques s’inscrit dans la généralisation de l’emploi de l’outil informatique. Mais elle résulte aussi d’un détournement: l’ordinateur, en effet, n’a pas été conçu pour l’art. Ses caractéristiques… …   Encyclopédie Universelle

  • Informatique Musicale — L informatique musicale est une discipline qui comporte des aspects de synthèse sonore et d aide à la composition musicale. Dans les années 1950 1970, l essor de la technologie numérique des ordinateurs a chamboulé la composition musicale qui,… …   Wikipédia en Français

Share the article and excerpts

Direct link
Do a right-click on the link above
and select “Copy Link”