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 クラスは 1 つしかありません。

ではごきげんよう、

ポール

于 2009-01-16T03:50:15.360 に答える
9

クラスはタイプです(「SUV」のような)。オブジェクトは、クラス( "David's SUV")のインスタンスです。

于 2009-01-15T22:08:47.860 に答える
7

Perl の場合:

  • クラスは--apackage仕様です。主にこれらの動作を支援する一連の動作とデータ。
  • 通常、オブジェクトは「ハッシュリファレンス」です。これは、パッケージ内の動作仕様 (および継承された動作) で許可されている特定のデータのコレクションです。

現在、hashref はコード参照を保持している可能性があります。ほとんどの場合、それは振る舞いです。しかし、オブジェクトがその特定の動作を使用できる唯一の方法は、継承された (または混合された) クラスの動作によって指定されることです。

于 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 に答える
0

他の言語で同じように用語を使用している人は見当たりません。それが質問の理由の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 データベース接続です。

于 2009-01-16T02:38:04.087 に答える