В чем разница между объектом и классом в Perl? - PullRequest
6 голосов
/ 16 января 2009

У меня небольшая проблема с тем, чтобы осмыслить концептуальную разницу между объектом и классом. Я не очень понимаю различие между ними в любом языке программирования, но в настоящее время я работаю с Perl и Moose, поэтому я бы предпочел объяснение с использованием этих вещей.

Приветствия

Ответы [ 8 ]

20 голосов
/ 16 января 2009

Существует много «класс - это проект, объект - это нечто, построенное из этого проекта», но, поскольку вы запросили конкретный пример с использованием 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

Если я хочу, я могу иметь столько объектов Hacker, сколько мне нравится, но есть только один класс Hacker, который описывает, как все они работают.

Всего наилучшего,

Пол

9 голосов
/ 16 января 2009

Класс - это тип (например, «внедорожник»). Объект является экземпляром класса («внедорожник Дэвида»).

7 голосов
/ 16 января 2009

Мудро:

  • A класс является package - спецификацией. Набор поведений и данных, главным образом, чтобы помочь этим поведениям.
  • Объект обычно является "hashref", который представляет собой набор конкретных данных, разрешенных спецификацией поведения в пакете (и унаследованных поведений).

Теперь хэш-ссылка может содержать ссылку на код. В большинстве случаев это поведение. Но единственный способ, которым объект мог бы использовать это специфическое поведение, - это указать его определенным поведением класса, унаследованным (или смешанным), которое ожидает, что в этом месте может быть coderef, вызывающий его.

3 голосов
/ 16 января 2009

Еще один способ представить себе класс - это план того, как будет построен объект.

2 голосов
/ 16 января 2009

Вы объект класса Человек

(Классы в Perl - это модули с некоторыми особыми качествами, лучше сначала разобраться только в общем случае).

2 голосов
/ 16 января 2009

Объекты являются единичными экземплярами класса.

1 голос
/ 04 июля 2016

В классе perl нет ничего, кроме имени пакета. У него есть общий код для объектов.

объект - это экземпляр, который имеет доступ к свойствам класса и методы.

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

Автомобиль вышеуказанного класса может использоваться любым транспортным средством, таким как велосипед, автомобиль, фургон и т. Объект создан оператором благослови.

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

Теперь благословение создает объект Honda для автомобиля класса.

0 голосов
/ 16 января 2009

Я не вижу людей, использующих термины таким же образом на других языках. Это может быть одной из причин вопроса. Я думаю, может быть, пользователи PHP говорят «класс», когда они должны говорить «объект», большую часть времени?

В любом случае, как насчет этого примера - представьте, что вам нужно было создать два разных соединения с базой данных для двух разных баз данных:

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

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

вы бы создали два объекта для выполнения двух разных задач, но оба они одинаковы вид вещей - соединения с базой данных DBI.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...