2009-01-15 6 views

Antwort

20

Es gibt viele "eine Klasse ist ein Blueprint, ein Objekt ist etwas, das aus diesem Blueprint gebaut wurde", aber da Sie nach einem bestimmten Beispiel mit Moose und Perl gefragt haben, dachte ich, ich würde eins zur Verfügung stellen.

In diesem folgenden Beispiel haben wir eine Klasse namens "Hacker".Die Klasse (wie ein Bauplan) beschreibt, was Hacker sind (ihre Attribute) und was sie tun können (ihre Methoden):

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. 

Jetzt, wo wir unsere Hacker Klasse haben, können wir beginnen Hacker machen Objekte:

#!/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; 

Dieses in der folgenden Ausgabe führt:

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 

Wenn ich will, ich ca Ich habe so viele Hacker-Objekte, wie ich möchte, aber es gibt immer noch nur eine Hacker-Klasse, die beschreibt, wie all diese funktionieren.

Alles Gute,

Paul

+1

Wow, SUPER antwort .. kurze Zusammenfassung am Anfang, dann eine reale Welt Probe & Tutorial in Elch! DANKE! – lexu

+0

Sehe jetzt dachte ich, das war übermäßig worry aber hey das ist nur ich. Gute Antwort. :) – cletus

9

Eine Klasse ist ein Typ (wie "SUV"). Ein Objekt ist eine Instanz einer Klasse ("Davids SUV").

+2

Ich habe immer die bawdier Form bevorzugt: Sie können nicht mit Frau (Klasse) schlafen, aber Sie können mit Debbie (Objekt) schlafen. Natürlich ändern, um Ihren persönlichen Geschmack zu entsprechen .... – nezroy

+0

Aber Sie können Frau hören :: brüllen(). Dies ist eine statische Methode. :-) –

2

Objekte sind einzelne Instanzen einer Klasse.

3

Eine andere Möglichkeit, darüber nachzudenken, ist eine Klasse ist eine Blaupause dafür, wie ein Objekt gebaut wird.

2

Sie sind ein Objekt der Klasse Menschen

(Klassen in Perl sind Module mit einigen speziellen Eigenschaften, sollten Sie besser zuerst nur den allgemeinen Fall verstehen).

7

Perl-weise:

  • A Klasse ist eine package --a Spezifikation. Eine Reihe von Verhaltensweisen und Daten, hauptsächlich um diese Verhaltensweisen zu unterstützen.
  • Ein Objekt ist in der Regel ein "hashref", dh eine Sammlung spezifischer Daten, die von der Verhaltensspezifikation im Paket (und geerbten Verhaltensweisen) zugelassen sind.

Nun könnte eine hashref eine Code-Referenz enthalten. In den meisten Fällen ist das Verhalten. Die einzige Möglichkeit, mit der das Objekt dieses spezifische Verhalten verwenden kann, besteht darin, dass es durch ein vererbtes (oder eingemischtes) Klassenverhalten angegeben wird, das erwartet, dass eine Codeferenz an diesem Ort vorhanden sein und sie aufrufen kann.

0

Ich sehe nicht, dass Menschen die Begriffe auf die gleiche Weise in anderen Sprachen verwenden. Das mag ein Grund für die Frage sein. Ich denke, PHP-Benutzer sagen "Klasse", wenn sie oft "Objekt" sagen sollten?

Wie auch immer, was ist mit diesem Beispiel - vorstellen mußte man zwei verschiedene Datenbankverbindungen für zwei verschiedene Datenbanken erstellen:

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

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

Sie zwei Objekte zu tun zwei verschiedene Dinge geschaffen hätten, aber sie sind beide das gleiche Art der Sache - DBI Datenbankverbindungen.

1

In Perl-Klasse ist nichts, aber es ist ein Paketnamen. Es hat einen gemeinsamen Code für die Objekte.

Objekt ist eine Instanz, die auf die Klasseneigenschaften und Methoden zugreifen kann.

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

Das oben genannte Klassenfahrzeug kann von jedem möglichem Fahrzeug wie Fahrrad, Auto, van..etc benutzt werden. Das Objekt wird vom Operator bless erstellt.

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

Jetzt schafft der Segen das Objekt Honda für das Klassenfahrzeug.