我在解决对象和类之间的概念差异方面遇到了一些麻烦。我真的不明白两者在任何编程语言中的区别,但目前我正在使用Perl和Moose,所以我更喜欢使用这些东西进行解释。
干杯
答案 0 :(得分: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
如果我想要我可以拥有尽可能多的黑客对象,但仍然只有一个黑客类可以描述所有这些对象的工作原理。
一切顺利,
保
答案 1 :(得分:9)
类是一种类型(如“SUV”)。对象是类的实例(“David的SUV”)。
答案 2 :(得分:7)
Perl-wise:
package
- 规范。一组行为和数据主要用于帮助这些行为。 现在,hashref可能包含代码引用。在大多数情况下,这是行为。但是对象可以使用该特定行为的唯一方法是由一些继承(或混合)的类行为指定,该行为期望可能存在位于该位置并调用它的coderef。
答案 3 :(得分:3)
另一种思考方式是类是如何构建对象的蓝图。
答案 4 :(得分:2)
对象是类的单个实例。
答案 5 :(得分:2)
你是人类
的对象(Perl中的类是具有一些特殊性质的模块,您最好先了解一般情况)。
答案 6 :(得分:1)
在perl类中,它只是一个包名。 它有一个共同的对象代码。
object是一个可以访问类属性的实例 和方法。
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';
现在,祝福为班车创造了本田对象。
答案 7 :(得分:0)
我不认为人们在其他语言中使用相同的术语。这可能是问题的一个原因。我想也许PHP用户在很多时候应该说“对象”时会说“课堂”?
无论如何,这个例子怎么样 - 想象你必须为两个不同的数据库创建两个不同的数据库连接:
my $oracle_database_handle = DBI->connect( <oracle connection details here> );
my $mysql_database_handle = DBI->connect( <mysql connection details here> );
你会创建两个对象来做两件不同的事情,但它们都是相同的 kind of thing - DBI数据库连接。