6

我很难理解对象和类之间的概念差异。我不太了解任何编程语言中两者之间的区别,但目前我正在使用 Perl 和 Moose,所以我更喜欢使用这些东西进行解释。

干杯

4

8 回答 8

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.

现在我们已经有了 Hacker,我们可以开始制作 Hacker对象了:

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

如果我愿意,我可以拥有尽可能多的 Hacker 对象,但仍然只有一个 Hacker 类描述了所有这些对象的工作方式。

祝一切顺利,

保罗

于 2009-01-16T03:50:15.360 回答
9

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

于 2009-01-15T22:08:47.860 回答
7

Perl 方面:

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

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

于 2009-01-15T22:38:44.740 回答
3

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

于 2009-01-15T22:09:50.913 回答
2

对象是类的单个实例。

于 2009-01-15T22:09:07.453 回答
2

你是类 Human 的对象

(Perl 中的类是具有一些特殊性质的模块,您最好先只了解一般情况)。

于 2009-01-15T22:33:08.403 回答
1

在 perl 中,类只是一个包名。它具有对象的通用代码。

object 是一个可以访问类的属性和方法的实例。

package vehicle;
sub vehicle_detail
{
($number,$model,$num_of_wheel)=@_;
print "My car Details:\n@_";
}

上述级别的车辆可用于任何车辆,如自行车、汽车、面包车等。该对象是由运营商 bless 创建的。

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

现在,bless 为类车辆创建对象 honda。

于 2016-07-04T11:02:45.427 回答
0

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

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

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

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

你会创建两个对象来做两种不同的事情,但它们都是同一种事情——DBI 数据库连接。

于 2009-01-16T02:38:04.087 回答