2009-01-15 22 views
6

Tengo un pequeño problema para entender la diferencia conceptual entre un objeto y una clase. Realmente no entiendo la distinción entre los dos en cualquier lenguaje de programación, pero actualmente estoy trabajando con Perl, y Moose, así que preferiría una explicación usando esas cosas.¿Cuál es la diferencia entre un objeto y una clase en Perl?

Saludos

Respuesta

20

Existen muchas "una clase es un plano, un objeto es algo construido a partir de ese plano", pero como solicitó un ejemplo específico usando Moose y Perl, pensé en proporcionar uno.

En este ejemplo siguiente, vamos a tener una clase llamada 'Hacker'.La clase (como un plano) describe lo que los hackers son (sus atributos) y lo que pueden hacer (sus métodos):

package Hacker;  # Perl 5 spells 'class' as 'package' 

use Moose;   # Also enables strict and warnings; 

# Attributes in Moose are declared with 'has'. So a hacker 
# 'has' a given_name, a surname, a login name (which they can't change) 
# and a list of languages they know. 

has 'given_name'  => (is => 'rw', isa => 'Str'); 
has 'surname'   => (is => 'rw', isa => 'Str'); 
has 'login'   => (is => 'ro', isa => 'Str'); 
has 'languages'  => (is => 'rw', isa => 'ArrayRef[Str]'); 

# Methods are what a hacker can *do*, and are declared in basic Moose 
# with subroutine declarations. 

# As a simple method, hackers can return their full name when asked. 

sub full_name { 
    my ($self) = @_; # $self is my specific hacker. 

    # Attributes in Moose are automatically given 'accessor' methods, so 
    # it's easy to query what they are for a specific ($self) hacker. 

    return join(" ", $self->given_name, $self->surname); 
} 

# Hackers can also say hello. 

sub say_hello { 
    my ($self) = @_; 

    print "Hello, my name is ", $self->full_name, "\n"; 

    return; 
} 

# Hackers can say which languages they like best. 

sub praise_languages { 
    my ($self) = @_; 

    my $languages = $self->languages; 

    print "I enjoy programming in: @$languages\n"; 

    return; 
} 

1; # Perl likes files to end in a true value for historical reasons. 

Ahora que tenemos nuestra clase Hacker , podemos empezar a hacer Hacker objetos:

#!/usr/bin/perl 
use strict; 
use warnings; 
use autodie; 

use Hacker; # Assuming the above is in Hacker.pm 

# $pjf is a Hacker object 

my $pjf = Hacker->new(
    given_name => "Paul", 
    surname => "Fenwick", 
    login  => "pjf", 
    languages => [ qw(Perl C JavaScript) ], 
); 

# So is $jarich 

my $jarich = Hacker->new(
    given_name => "Jacinta", 
    surname => "Richardson", 
    login  => "jarich", 
    languages => [ qw(Perl C Haskell) ], 
); 

# $pjf can introduce themselves. 

$pjf->say_hello; 
$pjf->praise_languages; 

print "\n----\n\n"; 

# So can $jarich 

$jarich->say_hello; 
$jarich->praise_languages; 

Esto se traduce en la siguiente salida:

Hello, my name is Paul Fenwick 
I enjoy programming in: Perl C JavaScript 

---- 

Hello, my name is Jacinta Richardson 
I enjoy programming in: Perl C Haskell 

Si quiero me ca Tengo tantos objetos Hacker como me gusta, pero todavía hay una sola clase de Hacker que describe cómo funcionan todos estos.

Todo lo mejor,

Paul

+1

Guau, SUPER respuesta ... resumen conciso al principio, luego una muestra del mundo real y tutorial en alce! ¡GRACIAS! – lexu

+0

Ver ahora, pensé que era demasiado prolijo, pero oye, eso es solo yo. Buena respuesta sin embargo. :) – cletus

9

Una clase es un tipo (como "SUV"). Un objeto es una instancia de una clase ("SUV de David").

+2

Siempre he preferido la forma bawdier: No puedes dormir con Woman (clase), pero puedes dormir con Debbie (objeto). Por supuesto, modifíquelo para satisfacer sus gustos personales ... – nezroy

+0

Pero puede escuchar a Woman :: rugir(). Este es un método estático. :-) –

2

Los objetos son instancias únicas de una clase.

3

Otra forma de pensar que es una clase es un modelo de cómo se construirá un objeto.

2

usted es un objeto de la clase humana

(Clases en Perl son módulos con algunas cualidades especiales, que deben comprender mejor primero sólo el caso general).

7

Perl-sabia:

  • A clase es una especificación --un package. Un conjunto de comportamientos y datos principalmente para ayudar a esos comportamientos.
  • Un objeto es típicamente un "hashref", que es una colección de datos específicos permitidos por la especificación de comportamiento en el paquete (y comportamientos heredados).

Ahora, un hashref puede contener una referencia de código. En la mayoría de los casos, eso es comportamiento. Pero la única forma en que el objeto podría usar ese comportamiento específico es que eso se especifique mediante algún comportamiento de clase heredado (o mezclado) que espera que haya un coderef sentado en ese lugar e invocarlo.

0

No veo que las personas usen los términos de la misma manera en otros idiomas. Esa puede ser una razón para la pregunta. Creo que tal vez los usuarios de PHP dicen "clase" cuando deberían decir "objeto", muchas veces.

De todos modos, ¿qué pasa con este ejemplo - Imagínese que usted tiene que crear dos conexiones de bases de datos diferentes para los dos bases de datos diferentes:

my $oracle_database_handle = DBI->connect(<oracle connection details here>); 

my $mysql_database_handle = DBI->connect(<mysql connection details here> ); 

que habría creado dos objetos para hacer dos cosas diferentes, pero son tanto el mismo tipo de cosa - conexiones de base de datos DBI.

1

En la clase de Perl es nada pero es un nombre de paquete. Tiene un código común para los objetos.

objeto es una instancia que tiene acceso a las propiedades de la clase y métodos.

package vehicle; 
sub vehicle_detail 
{ 
($number,$model,$num_of_wheel)[email protected]_; 
print "My car Details:\[email protected]_"; 
} 

El vehículo de la clase anterior puede ser utilizado por cualquier vehículo, como bicicleta, automóvil, van ... etc. El objeto es creado por el operador bless.

$bike_name='honda'; 
$ref_bike=\$bike_name; 
bless $ref_bike,'vehicle'; 

Ahora la bendición crea el objeto honda para el vehículo de la clase.

Cuestiones relacionadas