2009-01-15 56 views

回答

20

有很多「一個類是一個藍圖,一個對象是從這個藍圖構建的東西」,但既然你已經要求使用Moose和Perl的具體示例,我想我會提供一個。

在下面的例子中,我們將有一個名爲'Hacker'的類。類(如藍圖)描述的黑客是什麼(他們的屬性)和他們能做什麼(他們的方法):

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. 

現在我們已經得到了我們的黑客,我們就可以開始做黑客對象

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

這將導致以下的輸出:

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 

如果我想我CA n儘可能多地擁有黑客對象,但仍然只有一個黑客類描述所有這些工作。

一切順利,

保羅

9

類是類型(如「SUV」)。一個對象是一個類的實例(「大衛的SUV」)。

+2

我一直比較喜歡這種形式:你不能和女人(班級)一起睡覺,但是你可以和黛比(對象)一起睡覺。當然,修改以適應你的個人口味...... – nezroy 2009-01-15 22:44:45

+0

但你可以聽到女人::咆哮()。這是一種靜態方法。 :-) – 2009-01-15 22:58:06

2

對象是一個類的單個實例。

3

想想它的另一種方式是類是如何構建對象的藍圖。

2

您是一流的人力

(在Perl類是一些特殊的素質模塊,您最好先了解只是一般情況下)的對象。

7

Perl的明智:

  • package --a規範。主要用於幫助這些行爲的一組行爲和數據。
  • 對象對象通常是一個「hashref」,它是包中行爲規範所允許的特定數據的集合(以及繼承行爲)。

現在,hashref可能包含代碼引用。在大多數情況下,這是行爲。但是對象可以使用該特定行爲的唯一方法是通過繼承(或混合)的某些類行爲來指定,該行爲期望可能會有位於該位置的coderef並調用它。

0

我沒有看到人們在其他語言中使用相同的方式。這可能是這個問題的一個原因。我想也許PHP用戶說他們應該說「對象」,很多時間「類」?

不管怎麼說,這個例子 - 假設你必須爲兩個不同的數據庫創建兩個不同的數據庫連接:

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

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

你已經創建了兩個對象做兩個不同的東西,但他們都與DBI數據庫連接相同的

1

在perl的類是什麼,但它是一個包的名稱。 它具有對象的通用代碼。

對象是一個可以訪問類的屬性 和方法的實例。

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

上述班級車輛可用於任何車輛,如自行車,汽車,麪包車等。 該對象由操作員保佑創建。

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

現在,保佑爲班級車輛創建物體本田。

相關問題