나는 무스로 놀아왔다. 나는 순수한 가상 함수의 예를 C++과 비슷하지만 무언의 말투 (특히 C++에서 보이는 방식)로하고 싶다. Moose가 일반 Perl보다 엄격한 모델을 부과하는 경우에도 메소드 수정 자나 SUPER::
호출을 통해 요청하는 것을 수행하는 방법이 여러 가지가 있다는 것을 알고 있습니다. 그래서 C++과 유사한 구현을 가능한 한 많이 요구하고 있습니다. "왜?" 이 제한 사항 중? C++ 중심의 사람들이 대부분 으로 식별 할 수있는 방법으로 무언가와 함께 Perl에 약간의 C++ 코드를 포팅하려는 계획이 대부분 호기심입니다. 여기OOP 용 Perl을 사용하는 C++과 같은 사용법
답변
나는 서브 클래스 대신 역할을 사용하여이 방법을 생각할 수 있습니다 : 리얼 물건 정의가 없기 때문에
{
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" }
}
그래,이게 내가 인터페이스 만 원하면 어떻게 할 수 있겠 니? 저는 연구와 토론을 통해 내가 원하는 바를 정확히 수행 할 수 없다는 것을 알아 냈습니다. –
나는 이것이 당신에게 대부분의 길을 준다라고 생각한다. irc.perl.org의 #moose 또는 [email protected]의 메일 링리스트와 채팅하십시오. – draegtun
@draegtun 그래, 나는 이것이 내가 바라는 가장 좋은 근사치라고 생각한다. 당신의 도움을 주셔서 감사합니다! –
이다 (역할 참조에 대한 자세한 내용은 역할없이 다른 답변) 내 시도했다 : 내가 정확히 내가 무스와 함께 원하는 것을 할 수 없습니다 나타납니다
package Abstract;
use Moose;
sub stuff;
package Real;
use Moose;
extends 'Abstract';
override 'stuff' => sub { print "Using child function!\n"; }
당신이 무슨 말하는지는 모르겠지만 추상적 인 기본 클래스이고 추상적 인 기본 클래스 인'stuff' 메소드 (함수가 아닌)를 순수 가상으로 만들고 싶습니다. 단지'sub stuff {}'를 쓰면 즉시 위반됩니다. 따라서, 기본 클래스 메소드는'sub stuff {croak} '이어야합니다. –
@Sinan 나는 C++과 같은 것을하려고했다 : virtual void stuff() = 0; –
@Sinan 나는 croak을 물건에 추가하는 데 두 가지 문제가 있습니다. 1) 컴파일되지 않았습니다. 2) Croak이 구현의 형태라고 주장 할 수 있습니다. (순수 가상 함수의 정의를 잘못 해석하지 않는 한)) 내가하는 일과 정확히 반대입니다. 하위 자료를 수정 중입니다. {; } 서브 물건으로; –
,하지만 난 매우 가까이 올 수 있습니다 역할. 추상 기본 클래스 대
역할은 다른 언어로 추상 기본 클래스의 개념 잘 알고있는 경우
, 당신이 유혹 할 수있다 : 여기에 역할에 대한 무스 설명서 entry 정보입니다 같은 방식으로 역할을 사용하십시오.
필수 메소드의 목록 만 포함하는 "인터페이스 전용" 역할을 정의 할 수 있습니다.
그러나이 역할을 사용하는 클래스는 모두 필수 메서드를 직접 구현하거나 부모로부터 상속을 통해 필수 구현 메서드를 구현해야합니다. 은 메소드 요구 사항 검사를 지연 할 수 없으므로 향후 서브 클래스에서 을 구현할 수 있습니다.
역할이 필요한 메서드를 직접 정의하므로 기본 클래스 을 추가해도 아무 것도 얻을 수 없습니다. 이 해당 인터페이스를 구현하는 각 클래스에서 인터페이스 역할을 단순히 사용하는 것이 좋습니다.
스냅! 당신의 대답은 내가 내 것을 정리할 때처럼 나타났다 ;-) – draegtun
@draegtun 어떻게 그런 일이 일어 났는지 재밌다! 당신의 대답은 정말로 도움이됩니다. 특히 무스로 인터페이스를 구현하려는 사람들에게 도움이됩니다. 방금 추가 연구를 통해 발견 한 이상한 질문이 결정 론적 답변이 아닐 수도 있습니다. 나는 물어보기 전에이 부분을 완전히 이해하지 못했거나 무스가이 기능을 잃어 버렸기 때문에이 부분이 무엇인지 결정하려고하고있다.) –
흠. 그것은 나만인가, 아니면 도움이 실제로 도움이되지 않는가? '같은 클래스가 아니기 때문에 작동하지 않는 역할을 가진 추상 클래스를 구현하기를 원한다면 말입니다. 대신, 저기를 봐, 날고있는 돼지 *! 나는 여전히 (a) 추상 클래스의 계층 구조 (특히 MooseX :: ABC가 좋은 것으로 간주되는지 아닌지) 또는 대안으로 (b) 왜 ABC가 무스 프로그램에 좋지 않은지에 관심이있다. – ijw
는 또한 제시 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.20을 가리키는 링크가 현재 버전으로 업데이트되었습니다. 버전 0.30에서는 추가 추상 클래스를 사용하여 추상 기본 클래스를 서브 클래 싱하는 작업을 추가했습니다. – spazm
- 1. OOP 문서 사용법 학습
- 2. PHP OOP 라인 사용법 설명
- 3. oop mvc를 사용하는 리펙터
- 4. 펄 모듈 사용법?
- 5. Appcelerator 티타늄의 OOP 용 CommonJS
- 6. SetProcessWorkingSetSize 사용법
- 7. 사용법 #include
- 8. Dancer perl을 사용하는 여러 개의 앱 디렉토리
- 9. mod의 사용법 : instance_method?
- 10. 설정 파일을 빌드하기위한 이진 파일을 사용하는 Mercurial 저장소 사용법
- 11. 연동 된 사용법
- 12. 보다 간단한 사용법 without_access_control
- 13. 이해 참조 사용법
- 14. LauncherActivity 사용법
- 15. GObject.add_emission_hook 사용법
- 16. JScrollPane 사용법
- 17. 부스트의 "cstdint"사용법
- 18. SQLite 사용법 - Android
- 19. C#의 웹캠 사용법
- 20. GWT 세포 나무, 사용법?
- 21. Spring에서의 ModelMap 사용법
- 22. PHP OOP 아키텍처 질문 (역할에 대한 OOP)
- 23. 시맨틱 #region 사용법
- 24. Monochot의 UIPickerViewModel.GetView - 사용법?
- 25. 올바른 사용법 ProcessBuilder
- 26. heirachical XML에서 Nillable 사용법? 아래 같은 XML 구조를 가질 때
- 27. 오이 피클의 path_to_pickle 사용법
- 28. iPhone - dequeueReusableCellWithIdentifier 사용법
- 29. twoLineListItem의 올바른 사용법 안드로이드
- 30. CakePHP displayField 사용법
질문에서 답변 섹션으로 이동했습니다. –
Yikes,이 질문은 Perl에서 무스로 순수 가상 기능을 검색 할 때 이미 3 번째로 응답 한 것입니다. 흥미가있는 사람들을 위해, 이것과 관련된 준회원 토론은 여기에있다 : http://www.perlmonks.org/?node_id=742013. 그들은저기서 구체적인 대답을하지 않는 것 같습니다. –
아마도 C++ 프로그래머를 제외한 모든 사람들이 "메소드"라고 부르기 때문입니다. – jrockway