我在理解對象和類之間的概念差異時遇到了一些麻煩。我不太瞭解任何編程語言中兩者之間的區別,但目前我正在與Perl和Moose合作,所以我更願意使用這些東西進行解釋。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」)。
對象是一個類的單個實例。
想想它的另一種方式是類是如何構建對象的藍圖。
您是一流的人力
(在Perl類是一些特殊的素質模塊,您最好先了解只是一般情況下)的對象。
Perl的明智:
package
--a規範。主要用於幫助這些行爲的一組行爲和數據。現在,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';
現在,保佑爲班級車輛創建物體本田。
我一直比較喜歡這種形式:你不能和女人(班級)一起睡覺,但是你可以和黛比(對象)一起睡覺。當然,修改以適應你的個人口味...... – nezroy 2009-01-15 22:44:45
但你可以聽到女人::咆哮()。這是一種靜態方法。 :-) – 2009-01-15 22:58:06