일부 모듈에는 객체 지향 인터페이스 만 있습니다 (객체를 만들지는 않았지만 유틸리티 기능 만 보유하고 있음). 그 점이 있습니까?오브젝트를 만들지 않으면 Perl의 객체 지향 인터페이스에 대한 포인트가 있습니까?
답변
먼저 Perl에서 클래스가 패키지를 통해 이상한 방식으로 구현된다는 사실을 기억하는 것이 중요합니다. 패키지는 일반 네임 스페이스 오염 방지에도 사용됩니다.
package Foo;
sub new {
my ($class) = @_;
my $self = bless {}, $class;
return $self;
}
1;
은 당신이 (AN은 Foo-를 호출하여 인스턴스를 반대 한 수> 신규 또는 새로운 푸) 펄에서 푸 클래스를 만드는 방법이다. new
의 사용은 단순한 규칙입니다. 그것은 무엇이든 될 수 있습니다. 사실 new
은 C++이 정적 메서드 호출이라고 부르는 것입니다.
정적 메서드 호출 만 포함하는 패키지를 쉽게 만들 수 있습니다. 그리고 나는 이것이 당신이 말하는 것입니다. 다음,
package Bar;
sub DoSomething {
my ($class, $arg) = @_;
$class->Compute($arg);
}
sub Compute {
my ($class, $arg) = @_;
$arg * 2;
}
1;
package Baz;
@Baz::ISA = qw(Bar);
sub Compute {
my ($class, $arg) = @_;
$arg * 2 - 1
}
1;
점을 감안
say Bar->DoSomething(3) # 6
say Baz->DoSomething(3) # 5
사실, 당신도 클래스 이름에 대한 변수를 사용할 수 있으므로이 매우 작동 할 수 있습니다 : 여기 장점은 여전히 OO 상속과 같은 기능을 사용할 수 있다는 것입니다 싱글 톤과 매우 유사합니다.
my $obj = "Baz"; # or Baz->new could just return "Baz"
print $obj->DoSomething(3) # 5
[코드는 테스트되지 않았습니다. 오타가있을 수 있습니다]
대부분이 네임 스페이스입니다. 왜 안돼? perl을 향상시키는 모든 것이 나의 완전한 승인을 얻습니다.
이것은 명령형 프로그래밍보다 OO를 선호하는 저자의 입장에서 대부분 철학적 인 선택이라고 생각합니다. 다른 사람들은 네임 스페이스를 설정하는 것에 대해 언급했지만, 인터페이스가 아니라 패키지를 사용하는 패키지입니다. 객체 지향은 필요하지 않습니다.
가 개인적으로 인스턴스화되지 않습니다 클래스를 만드는 작은 가치를 (아무 개체있다 즉 때에서 객체 지향을). 펄은 자바가 아닙니다. 당신은 모든 것에 대한 수업을 작성할 필요가 없습니다. 일부 모듈은 이것을 인정합니다. 예 : File :: Spec에는 OO 인터페이스가 있지만 File :: Spec :: Functions를 통해 기능 인터페이스를 제공합니다.
File :: Spec은 또한 OO 이이 아닌 인스턴스의 "유틸리티"인터페이스에 유용 할 수있는 예제를 제공합니다. 기본적으로 File :: Spec은 추상 기본 클래스입니다. 구현이없는 인터페이스입니다. File :: Spec을로드하면 사용중인 OS를 확인하고 적절한 구현을로드합니다. 프로그래머는 실제로 전화 할 catfile
(Unix, Windows, VMS 등)의 버전에 대해 걱정할 필요없이 인터페이스 (예 : File::Spec->catfile
)를 사용합니다.
모듈 작성 관점에서 : 처음부터 화살표 인터페이스를 사용하면 나중에 상속을 추가 할 수 있습니다. 직선 서브 호출을 사용하고 상속을 도입하려면 전체 인터페이스를 변경하거나 검정색 Exporter 마법을 사용해야합니다. – hobbs
파이썬에서 모든 것을 위해 객체를 만들 필요는 없습니다. 적어도 당신이 할 때 그것은 깨끗합니다. –
다른 사람들이 말했듯이, 실제 개체가 필요하지 않다면 상속은 큰 이득입니다. 그것을 만들기 위해,
package Foo;
# just a static method call
sub func
{
my $class = shift;
my (@args) = @_;
# stuff...
}
내가 오히려이 $보다, 클래스 명 "
$class
"를 보유하고있는 변수 이름 : 내가 여기에 추가 할 필요가있는 유일한 방법은 예를 들어, 이러한 인터페이스를 작성할 때 당신의 변수에 이름을 조언이다 func()가 $ foo-> func() (인스턴스화 된
Foo
객체와 함께) 대신 Foo-> func()로 호출 될 것임을 후속 유지 자에게 알리십시오.어떤 객체가 "
key
"키를 얻기 위해 복종하지 않으려면이있는 한,
my $value = $this->{key};
... 실패 :이 방법은 나중에이 줄을 추가하는 사람을 방지 할 수 있습니다. 방법은 정적 또는 인스턴스화 된 객체에 대해 호출 할 수있는 경우 (사용자 정의 AUTOLOAD 방법을 작성할 때, 예를 들어)
, 당신이 쓸 수 있습니다 :
my method
{
my $this = shift;
my $class = ref($this) || $this;
my (@args) = @_;
# stuff...
}
- 1. 기본 인터페이스에 객체 캐스팅
- 2. vb6에서 객체 지향 | 좋은 디자인에 대한 좋은 참조가 있습니까?
- 3. Python의 객체 지향 프로그래밍에 대한 기본적인 질문
- 4. 객체 지향 자바 스크립트에 대한 혼동
- 5. 객체 지향 프로그래머를위한 스키마
- 6. C++ 객체 지향 디자인
- 7. 객체 지향 프로그래밍
- 8. 객체 지향 프로그래밍 (HOW!)
- 9. 객체 지향 CSS
- 10. 객체 지향 설계 문제의 실제 사례에 대한 온라인 자료가 있습니까?
- 11. 객체 지향 프로그래밍 : 연결
- 12. 객체 지향 디자인 문제
- 13. 객체 지향 프로그래머를위한 C
- 14. PHP 객체 지향 가시성
- 15. 객체 지향 네트워킹
- 16. 객체 지향 TCL
- 17. BigTable 객체 지향 데이터베이스입니까?
- 18. 객체 지향 프로그래머
- 19. 객체 지향 프로그래밍 질문
- 20. 객체 지향 자바 스크립트
- 21. 객체 지향 Python
- 22. VBA 객체 지향
- 23. 루아는 객체 지향 언어입니까?
- 24. 객체 지향 설계 제안
- 25. 객체 지향 디자인
- 26. Python 객체 지향 프로그래밍
- 27. 객체 지향 설계
- 28. 기본 객체 지향 상속
- 29. 객체 지향 실행
- 30. Perl에서 객체 지향 예외 처리에 가치가 있습니까?
상속하실 수 있습니다 .. 내가 비록 을 개인적으로 네임 스페이스 해킹 일 뿐이므로 OO perl 자체에서 많은 점을 보지 못한다. – sud03r
"네임 스페이스 해킹"은 perls 객체 시스템을 가장 유연하고 유용한 시스템 중 하나로 만든다. 이 경우 나는 "해킹"이 "쓰레기 같은"진부한 종류가 아니라 우아한 유용한 종류라고 생각한다. –