Perl中的对象和类之间有什么区别?

问题描述:

我在理解对象和类之间的概念差异时遇到了一些麻烦。我不太了解任何编程语言中两者之间的区别,但目前我正在与Perl和Moose合作,所以我更愿意使用这些东西进行解释。Perl中的对象和类之间有什么区别?

干杯

有很多“一个类是一个蓝图,一个对象是从这个蓝图构建的东西”,但既然你已经要求使用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尽可能多地拥有黑客对象,但仍然只有一个黑客类描述所有这些工作。

一切顺利,

保罗

类是类型(如“SUV”)。一个对象是一个类的实例(“大卫的SUV”)。

+2

我一直比较喜欢这种形式:你不能和女人(班级)一起睡觉,但是你可以和黛比(对象)一起睡觉。当然,修改以适应你的个人口味...... – nezroy 2009-01-15 22:44:45

+0

但你可以听到女人::咆哮()。这是一种静态方法。 :-) – 2009-01-15 22:58:06

对象是一个类的单个实例。

想想它的另一种方式是类是如何构建对象的蓝图。

您是一流的人力

(在Perl类是一些特殊的素质模块,您最好先了解只是一般情况下)的对象。

Perl的明智:

  • package --a规范。主要用于帮助这些行为的一组行为和数据。
  • 对象对象通常是一个“hashref”,它是包中行为规范所允许的特定数据的集合(以及继承行为)。

现在,hashref可能包含代码引用。在大多数情况下,这是行为。但是对象可以使用该特定行为的唯一方法是通过继承(或混合)的某些类行为来指定,该行为期望可能会有位于该位置的coderef并调用它。

我没有看到人们在其他语言中使用相同的方式。这可能是这个问题的一个原因。我想也许PHP用户说他们应该说“对象”,很多时间“类”?

不管怎么说,这个例子 - 假设你必须为两个不同的数据库创建两个不同的数据库连接:

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

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

你已经创建了两个对象做两个不同的东西,但他们都与DBI数据库连接相同的

在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'; 

现在,保佑为班级车辆创建物体本田。