オブジェクトとクラスの概念の違いについて頭を悩ませています。プログラミング言語での違いはよくわかりませんが、現在はPerlとMooseを使っているので、それらを使った説明をしたいと思います。
乾杯
「クラスは設計図、オブジェクトはその設計図から構築されたもの」が多いのですが、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 クラスは 1 つしかありません。
ではごきげんよう、
ポール
クラスはタイプです(「SUV」のような)。オブジェクトは、クラス( "David's SUV")のインスタンスです。
Perl の場合:
package
仕様です。主にこれらの動作を支援する一連の動作とデータ。現在、hashref はコード参照を保持している可能性があります。ほとんどの場合、それは振る舞いです。しかし、オブジェクトがその特定の動作を使用できる唯一の方法は、継承された (または混合された) クラスの動作によって指定されることです。
それを別の方法で考えると、クラスはオブジェクトがどのように構築されるかの青写真です。
オブジェクトは、クラスの単一インスタンスです。
あなたはクラス Human のオブジェクトです
(Perl のクラスはいくつかの特別な性質を持つモジュールです。最初に一般的なケースだけを理解する必要があります)。
他の言語で同じように用語を使用している人は見当たりません。それが質問の理由の1つかもしれません。多くの場合、PHP ユーザーは「オブジェクト」と言うべきときに「クラス」と言うのではないでしょうか。
とにかく、この例はどうですか? 2 つの異なるデータベースに対して 2 つの異なるデータベース接続を作成する必要があると想像してください。
my $oracle_database_handle = DBI->connect( <oracle connection details here> );
my $mysql_database_handle = DBI->connect( <mysql connection details here> );
2 つの異なることを行うために 2 つのオブジェクトを作成したことになりますが、それらはどちらも同じ種類のものであり、DBI データベース接続です。