최고의 펄 객체 지향 튜토리얼 2024년, 이 튜토리얼에서는 객체 지향의 기본 개념,클래스 정의,객체 생성 및 사용,정의 방법,상속,메소드의 오버라이드 (override),로드 기본,소멸자 및 가비지 컬렉션,객체 지향 펄로서는,를 배울 수 있습니다.
두 개의 다른 펄 객체 지향 프로그래밍을 구현하기가있다 :
개체, 클래스 및 방법 : 객체 지향, 우리는 셋을받은 많은 기본 개념이 있습니다.
개체 : 개체는 클래스 참조 데이터 항목입니다..
클래스 : 클래스는 클래스의 방법을 제공하는 개체를 포함하는 펄 패키지이다.
방법 :이 방법은 펄 서브 루틴은 클래스 이름은 첫 번째 인자이다.
펄은 참조를 통해 객체를 생성하고이 클래스와 연관된 이름을 축복 개체를 구성하는이 참조를 반환하는 데 사용됩니다 신의 축복 축복 () 함수를 제공합니다.
클래스는 단순한 패키지입니다.
는 클래스로 패키지를 사용하고, 사용하는 클래스 메소드의 함수로서 백 넣을 수있다.
펄 패키지는 별도의 네임 스페이스를 제공, 다른 패키지와 변수 이름의 방법은 충돌하지 않습니다.
펄가 .pm을위한 확장 클래스 파일.
다음으로 우리는 Person 클래스를 만듭니다
package Person;
스크립트 파일의 마지막 행, 또는 다음 키워드 전에 패키지에 클래스 코드 범위.
우리가 생성자를 정의 할 필요가 클래스 인스턴스 (객체) 만들기, 대부분의 프로그램은 생성자로 클래스 이름을 사용, 펄은 어떤 이름을 사용할 수 있습니다.
넌 펄 펄 객체와 같은 변수들을 사용할 수있다. 대부분에서 우리는 배열이나 해시 참조를 사용합니다.
다음으로 우리는 Person 클래스의 생성자를 만들 펄 해시 참조를 사용합니다.
객체를 생성 할 때, 객체 참조를 반환하는 서브 루틴이다 생성자를 제공 할 필요가있다.
다음 예는 다음과 같다 :
package Person; sub new { my $class = shift; my $self = { _firstName => shift, _lastName => shift, _ssn => shift, }; # 输出用户信息 print "名字:$self->{_firstName}\n"; print "姓氏:$self->{_lastName}\n"; print "编号:$self->{_ssn}\n"; bless $self, $class; return $self; }
다음으로, 우리는 개체를 만들 :
$object = new Person( "小明", "王", 23234345);
펄 클래스 메소드있을뿐 아니라 멤버 함수라고도 펄 서브 루틴이다.
객체 지향 펄 펄 메소드 정의 특별한 구문을 제공하지 않고, 첫 번째 파라미터는 참조 된 개체 또는 포장 방법을 지정한다.
펄은 개인 변수를 제공하지 않습니다, 그러나 우리는 보조 방법을 통해 오브젝트 데이터를 관리 할 수 있습니다.
다음에 우리는 이름을 얻을 수있는 방법을 정의합니다 :
sub getFirstName { return $self->{_firstName}; }
동일은 또한 쓸 수 있습니다 :
sub setFirstName { my ( $self, $firstName ) = @_; $self->{_firstName} = $firstName if defined($firstName); return $self->{_firstName}; }
다음 다음으로는, 코드 Person.pm 파일을 수정
#!/usr/bin/perl package Person; sub new { my $class = shift; my $self = { _firstName => shift, _lastName => shift, _ssn => shift, }; # 输出用户信息 print "名字:$self->{_firstName}\n"; print "姓氏:$self->{_lastName}\n"; print "编号:$self->{_ssn}\n"; bless $self, $class; return $self; } sub setFirstName { my ( $self, $firstName ) = @_; $self->{_firstName} = $firstName if defined($firstName); return $self->{_firstName}; } sub getFirstName { my( $self ) = @_; return $self->{_firstName}; } 1;
다음과 같이 employee.pl 스크립트 코드는 다음과 같습니다
#!/usr/bin/perl use Person; $object = new Person( "小明", "王", 23234345); # 获取姓名 $firstName = $object->getFirstName(); print "设置前姓名为 : $firstName\n"; # 使用辅助函数设置姓名 $object->setFirstName( "小强" ); # 通过辅助函数获取姓名 $firstName = $object->getFirstName(); print "设置后姓名为 : $firstName\n";
상기 프로그램을 실행 한 후, 출력된다 :
$ perl employee.pl 名字:小明 姓氏:王 编号:23234345 设置前姓名为 : 小明 设置后姓名为 : 小强
@ISA 배열, 다른 패키지 (클래스) 이름을 포함하는 배열로 연속 펄 클래스 메소드는 변수를 상속하는 것은 명시 적으로 설정해야합니다.
다중 상속 클래스 (패키지) 이름의 복수의 상기 @ISA 배열이다.
방법에만 @ISA을 통해 상속 될 수 있으며, 데이터는 상속 될 수 없습니다.
다음으로 우리는 클래스 직원이 Person 클래스를 상속 만듭니다.
다음과 같이 Employee.pm 파일의 코드는 다음과 같습니다
#!/usr/bin/perl package Employee; use Person; use strict; our @ISA = qw(Person); # 从 Person 继承
이제 Employee 클래스는 Person 클래스의 모든 메서드와 속성이 포함되어, 우리가 main.pl 파일과 실행에 다음 코드를 입력합니다 :
#!/usr/bin/perl use Employee; $object = new Employee( "小明", "王", 23234345); # 获取姓名 $firstName = $object->getFirstName(); print "设置前姓名为 : $firstName\n"; # 使用辅助函数设置姓名 $object->setFirstName( "小强" ); # 通过辅助函数获取姓名 $firstName = $object->getFirstName(); print "设置后姓名为 : $firstName\n";
상기 프로그램을 실행 한 후, 출력된다 :
$ perl main.pl 名字:小明 姓氏:王 编号:23234345 设置前姓名为 : 小明 设置后姓名为 : 小强
위의 예는, 직원 클래스 인 클래스를 확장하지만, Person 클래스의 메소드는 수요를 충족 할 수없는 경우, 그 방법을 다시 할 필요가있다.
다음으로, 우리는 Person 클래스 메소드를 Employee 클래스에 새로운 메소드를 추가하고, 오버라이드 (override) :
#!/usr/bin/perl package Employee; use Person; use strict; our @ISA = qw(Person); # 从 Person 继承 # 重写构造函数 sub new { my ($class) = @_; # 调用父类的构造函数 my $self = $class->SUPER::new( $_[1], $_[2], $_[3] ); # 添加更多属性 $self->{_id} = undef; $self->{_title} = undef; bless $self, $class; return $self; } # 重写方法 sub getFirstName { my( $self ) = @_; # 这是子类函数 print "这是子类函数\n"; return $self->{_firstName}; } # 添加方法 sub setLastName{ my ( $self, $lastName ) = @_; $self->{_lastName} = $lastName if defined($lastName); return $self->{_lastName}; } sub getLastName { my( $self ) = @_; return $self->{_lastName}; } 1;
우리는 다음과 같은 코드 main.pl 파일을 입력하고 실행합니다
#!/usr/bin/perl use Employee; $object = new Employee( "小明", "王", 23234345); # 获取姓名,使用修改后的构造函数 $firstName = $object->getFirstName(); print "设置前姓名为 : $firstName\n"; # 使用辅助函数设置姓名 $object->setFirstName( "小强" ); # 通过辅助函数获取姓名 $firstName = $object->getFirstName(); print "设置后姓名为 : $firstName\n";
상기 프로그램을 실행 한 후, 출력된다 :
$ perl main.pl 名字:小明 姓氏:王 编号:23234345 这是子类函数 设置前姓名为 : 小明 这是子类函数 设置后姓名为 : 小强
현재, 모든 기본 클래스의 현재 클래스 및 UNIVERSAL 요청 클래스 메소드의 클래스를 찾을 수없는 경우, 다음 ()를 다시하는 방법이라는 AUTOLOAD를 찾습니다. AUTOLOAD를 발견하는 경우 누락 된 방법의 글로벌 변수 $ AUTOLOAD 값의 완전한 이름을 설정하는 동안, 그것은 호출합니다.
그렇지 않다면, 그것은 펄 에러 실패.
당신이 기본 클래스 AUTOLOAD을 상속하지 않으려면, 매우 간단합니다, 그냥 한 문장 :
sub AUTOLOAD;
객체에 대한 최종 참조가 해제 될 때, 객체는 자동으로 소멸된다.
당신은 당신이라는 방법 "파괴"할 때 소멸자에서 뭔가를하려면 클래스에 정의되어 있습니다. 그것은 자동으로 적절한 시간에 전화 것입니다, 당신이 무엇을 의미하는지에 따라 추가 정리 작업을 수행 할 수 있습니다.
package MyClass; ko. sub DESTROY { print "MyClass::DESTROY called\n"; }
펄 객체 참조는 유일한 매개 변수로 파괴 전달됩니다. 참고이 인용은 당신이 _ [0]을 수정하려면 $에 액세스 할 수 없습니다 의미, 읽기 전용된다. (역자 주 : perlsub 참조)하지만, 객체 자체 (예 : "$ {$ _ [0]"또는 "@ {$ _ [0]}"와 "% {$ _ [0]}", 등) 또는 일 수있다 작성합니다.
당신이 소멸자를 반환하기 전에 객체 참조를 다시 축복 경우, 펄은 소멸자 반환 후 해당 개체의 재 축복 DESTROY 방법에 당신을 호출합니다. 이렇게하면 기본 클래스를 호출하거나 소멸자 다른 클래스를 지정할 수있는 기회를 가질 수 있습니다. 또한 수동으로 호출 할 수있는 파괴 언급하지만, 일반적으로 필요하지 않습니다해야합니다.
현재 개체의 출시 후, 현재 객체에 포함 된 다른 개체가 자동으로 해제됩니다.
우리는하기 실시 예 펄 객체 지향 어플리케이션에 의해 이해 될 수있다 :
#!/usr/bin/perl # 下面是简单的类实现 package MyClass; sub new { print "MyClass::new called\n"; my $type = shift; # 包名 my $self = {}; # 引用空哈希 return bless $self, $type; } sub DESTROY { print "MyClass::DESTROY called\n"; } sub MyMethod { print "MyClass::MyMethod called!\n"; } # 继承实现 package MySubClass; @ISA = qw( MyClass ); sub new { print "MySubClass::new called\n"; my $type = shift; # 包名 my $self = MyClass->new; # 引用空哈希 return bless $self, $type; } sub DESTROY { print "MySubClass::DESTROY called\n"; } sub MyMethod { my $self = shift; $self->SUPER::MyMethod(); print " MySubClass::MyMethod called!\n"; } # 调用以上类的主程序 package main; print "调用 MyClass 方法\n"; $myObject = MyClass->new(); $myObject->MyMethod(); print "调用 MySubClass 方法\n"; $myObject2 = MySubClass->new(); $myObject2->MyMethod(); print "创建一个作用域对象\n"; { my $myObject2 = MyClass->new(); } # 自动调用析构函数 print "创建对象\n"; $myObject3 = MyClass->new(); undef $myObject3; print "脚本执行结束ko.\n"; # 自动执行析构函数
위의 프로그램은 출력은 다음과 같습니다
调用 MyClass 方法 MyClass::new called MyClass::MyMethod called! 调用 MySubClass 方法 MySubClass::new called MyClass::new called MyClass::MyMethod called! MySubClass::MyMethod called! 创建一个作用域对象 MyClass::new called MyClass::DESTROY called 创建对象 MyClass::new called MyClass::DESTROY called 脚本执行结束ko. MyClass::DESTROY called MySubClass::DESTROY called