2009-08-27 1 views
6

나는 무스로 놀아왔다. 나는 순수한 가상 함수의 예를 C++과 비슷하지만 무언의 말투 (특히 C++에서 보이는 방식)로하고 싶다. Moose가 일반 Perl보다 엄격한 모델을 부과하는 경우에도 메소드 수정 자나 SUPER:: 호출을 통해 요청하는 것을 수행하는 방법이 여러 가지가 있다는 것을 알고 있습니다. 그래서 C++과 유사한 구현을 가능한 한 많이 요구하고 있습니다. "왜?" 이 제한 사항 중? C++ 중심의 사람들이 대부분 으로 식별 할 수있는 방법으로 무언가와 함께 Perl에 약간의 C++ 코드를 포팅하려는 계획이 대부분 호기심입니다. 여기OOP 용 Perl을 사용하는 C++과 같은 사용법

+0

질문에서 답변 섹션으로 이동했습니다. –

+1

Yikes,이 질문은 Perl에서 무스로 순수 가상 기능을 검색 할 때 이미 3 번째로 응답 한 것입니다. 흥미가있는 사람들을 위해, 이것과 관련된 준회원 토론은 여기에있다 : http://www.perlmonks.org/?node_id=742013. 그들은저기서 구체적인 대답을하지 않는 것 같습니다. –

+0

아마도 C++ 프로그래머를 제외한 모든 사람들이 "메소드"라고 부르기 때문입니다. – jrockway

답변

5

나는 서브 클래스 대신 역할을 사용하여이 방법을 생각할 수 있습니다 : 리얼 물건 정의가 없기 때문에

{ 
    package AbstractRole; 
    use Moose::Role; 
    requires 'stuff'; 
} 

{ 
    package Real; 
    use Moose; 
    with 'AbstractRole'; 
} 

이것은 컴파일 오류를 줄 것이다.

실시간으로 물건 방법을 추가하면 지금은 작동하게됩니다

{ 
    package Real; 
    use Moose; 
    with 'AbstractRole'; 

    sub stuff { print "Using child function!\n" } 
} 
+0

그래,이게 내가 인터페이스 만 원하면 어떻게 할 수 있겠 니? 저는 연구와 토론을 통해 내가 원하는 바를 정확히 수행 할 수 없다는 것을 알아 냈습니다. –

+0

나는 이것이 당신에게 대부분의 길을 준다라고 생각한다. irc.perl.org의 #moose 또는 [email protected]의 메일 링리스트와 채팅하십시오. – draegtun

+0

@draegtun 그래, 나는 이것이 내가 바라는 가장 좋은 근사치라고 생각한다. 당신의 도움을 주셔서 감사합니다! –

1

이다 (역할 참조에 대한 자세한 내용은 역할없이 다른 답변) 내 시도했다 : 내가 정확히 내가 무스와 함께 원하는 것을 할 수 없습니다 나타납니다

package Abstract; 
use Moose; 

sub stuff; 

package Real; 
use Moose; 
extends 'Abstract'; 

override 'stuff' => sub { print "Using child function!\n"; } 
+0

당신이 무슨 말하는지는 모르겠지만 추상적 인 기본 클래스이고 추상적 인 기본 클래스 인'stuff' 메소드 (함수가 아닌)를 순수 가상으로 만들고 싶습니다. 단지'sub stuff {}'를 쓰면 즉시 위반됩니다. 따라서, 기본 클래스 메소드는'sub stuff {croak} '이어야합니다. –

+0

@Sinan 나는 C++과 같은 것을하려고했다 : virtual void stuff() = 0; –

+0

@Sinan 나는 croak을 물건에 추가하는 데 두 가지 문제가 있습니다. 1) 컴파일되지 않았습니다. 2) Croak이 구현의 형태라고 주장 할 수 있습니다. (순수 가상 함수의 정의를 잘못 해석하지 않는 한)) 내가하는 일과 정확히 반대입니다. 하위 자료를 수정 중입니다. {; } 서브 물건으로; –

2

,하지만 난 매우 가까이 올 수 있습니다 역할. 추상 기본 클래스 대

역할은 다른 언어로 추상 기본 클래스의 개념 잘 알고있는 경우

, 당신이 유혹 할 수있다 : 여기에 역할에 대한 무스 설명서 entry 정보입니다 같은 방식으로 역할을 사용하십시오.

필수 메소드의 목록 만 포함하는 "인터페이스 전용" 역할을 정의 할 수 있습니다.

그러나이 역할을 사용하는 클래스는 모두 필수 메서드를 직접 구현하거나 부모로부터 상속을 통해 필수 구현 메서드를 구현해야합니다. 은 메소드 요구 사항 검사를 지연 할 수 없으므로 향후 서브 클래스에서 을 구현할 수 있습니다.

역할이 필요한 메서드를 직접 정의하므로 기본 클래스 을 추가해도 아무 것도 얻을 수 없습니다. 이 해당 인터페이스를 구현하는 각 클래스에서 인터페이스 역할을 단순히 사용하는 것이 좋습니다.

+0

스냅! 당신의 대답은 내가 내 것을 정리할 때처럼 나타났다 ;-) – draegtun

+0

@draegtun 어떻게 그런 일이 일어 났는지 재밌다! 당신의 대답은 정말로 도움이됩니다. 특히 무스로 인터페이스를 구현하려는 사람들에게 도움이됩니다. 방금 추가 연구를 통해 발견 한 이상한 질문이 결정 론적 답변이 아닐 수도 있습니다. 나는 물어보기 전에이 부분을 완전히 이해하지 못했거나 무스가이 기능을 잃어 버렸기 때문에이 부분이 무엇인지 결정하려고하고있다.) –

+2

흠. 그것은 나만인가, 아니면 도움이 실제로 도움이되지 않는가? '같은 클래스가 아니기 때문에 작동하지 않는 역할을 가진 추상 클래스를 구현하기를 원한다면 말입니다. 대신, 저기를 봐, 날고있는 돼지 *! 나는 여전히 (a) 추상 클래스의 계층 구조 (특히 MooseX :: ABC가 좋은 것으로 간주되는지 아닌지) 또는 대안으로 (b) 왜 ABC가 무스 프로그램에 좋지 않은지에 관심이있다. – ijw

5

는 또한 제시 Luehrs ' MooseX::ABC를 살펴 할 수 있습니다. 여기 구현의 일부와 매우 비슷하게 보입니다. 개요에서 :

package Shape; 
use Moose; 
use MooseX::ABC; 

requires 'draw'; 

package Circle; 
use Moose; 
extends 'Shape'; 

sub draw { 
    # stuff 
} 

my $shape = Shape->new; # dies 
my $circle = Circle->new; # succeeds 

package Square; 
use Moose; 
extends 'Shape'; # dies, since draw is unimplemented 

나는 Jesse가 그날 C++ 프로그래머라는 것을 알고 있습니다.

+0

팁 주셔서 감사합니다, 나는 확실히 그것을 체크 할 것입니다! –

+0

버전 0.20을 가리키는 링크가 현재 버전으로 업데이트되었습니다. 버전 0.30에서는 추가 추상 클래스를 사용하여 추상 기본 클래스를 서브 클래 싱하는 작업을 추가했습니다. – spazm