2014-04-10 5 views
0

두 가지 이상의 유형에 대해 유형 바인드 프로 시저와 동일한 기능을 사용하는 방법이 있습니까? 예 : 다음과 같은 상황을 상상해보십시오 :유형 바운드 프로 시저의 다형성

module definitions 
implicit none 

type type1 
    integer i 
    contains 
    procedure,pass :: init1 
end type 

type type2 
    integer i 
    contains 
    procedure,pass :: init2 
end type 

contains 

subroutine init1(x) 
    class(type1),intent(inout) :: x 
    x%i=3 
end subroutine 

subroutine init2(x) 
    class(type2),intent(inout) :: x 
    x%i=3 
end subroutine 

end module 

program test 
use definitions 

type(type1) ::a 
type(type2) ::b 

print*, a%i 
print*, b%i 
call a%init1 
print*, a%i 
print*, b%i 
call b%init2 
print*, a%i 
print*, b%i 

end program 

동일한 서브 루틴을 사용했지만 두 번 정의해야합니다. 그래서 저는

class(type1 .or. type2), intent(inout) :: x 

또는 이와 비슷한 것을 요청하고 있습니다. 이미 클래스 (*)를 사용해 보았습니다 만, 컴파일러가 x % i로 무엇을 해야할지 모르기 때문에 작동하지 않습니다. 정의되지 않았을 수도 있고, select 타입 블록과 조합되어 있지 않을 수도 있습니다. 실제 프로그램은 더 복잡하기 때문에 유형 정의의 유사한 부분을 병합 한 다음 두 유형을 정의하기 위해 쉽게 확장 할 수 없습니다. 미리 감사드립니다.

답변

1

직접적으로 가능하지 않습니다. 그런데 왜 확장 된 기본 유형을 만들지 않습니까?

module definitions 
implicit none 

type base 
    integer i 
contains 
    procedure,pass :: init 
end type 


type, extends(base) :: type1 
end type 

type, extends(base) :: type2 
end type 

contains 

subroutine init(x) 
    class(base),intent(inout) :: x 
    x%i=3 
end subroutine 

end module 

program test 
use definitions 

type(type1) ::a 
type(type2) ::b 

print*, a%i 
print*, b%i 
call a%init 
print*, a%i 
print*, b%i 
call b%init 
print*, a%i 
print*, b%i 

end program 

편집 (오후) : 이것은 내가 실제로 생각했던 문제 해결 :

module definitions 
implicit none 

type base 
integer :: i 
contains 
    procedure,pass :: init 
end type 

type, extends(base) :: type1 
integer:: j 
end type 

type, extends(base) :: type2 
integer:: k 
end type 

contains 

subroutine init(x) 
    class(base),intent(inout) :: x 
    integer :: m 
    select type (x) 
    type is (type1) 
    m=x%j 
    type is (type2) 
    m=x%k 
    end select 
    x%i=3*m 
end subroutine 

end module 

program test 
use definitions 

type(type1) ::a 
type(type2) ::b 

a%j=2 
b%k=4 
print*, a%i 
print*, b%i 
call a%init 
print*, a%i 
print*, b%i 
call b%init 
print*, a%i 
print*, b%i 

end program 
                                        1,5   Top 
+0

예 실제로이 예제에서 문제를 해결,하지만 실제로 나는 내 마지막이 솔루션을 제외하려고 문장. actuall 프로그램에서 함수는 확장에 의존하기 때문에. 이 혼란에 죄송합니다. 그래도 약간의 변화와 함께 그것의 wokring입니다. 그에 따라 게시물을 수정하고 답글로 태그를 지정하겠습니다. – PeMa

+0

이상합니다. 실제로 두 가지 구성 요소로 작업하는 경우에는 자녀 중 한 곳에만 존재합니다. 실제로 두 가지 별도의 절차를 사용해야합니다. 공유 부분이 있으면 기본 절차를 항상 호출 할 수 있습니다. –

+0

구성 요소는 구조가 동일하지만 하위 구성 요소의 전체 구성 요소의 다른 구성 요소에도 의존합니다. 그러나 마침내 나는 그들에게 같은 공식을 적용 할 필요가있다. 이것은 모든면에서 뒤에있는 육체적 인 의미에서도 놀라운 것입니다. 그러나 나는 세부 사항을 여기에서 정말로 기술 할 수 없다. 아직도 꽤 잘 작동하는 것 같습니다. 편집 할 때 '숨겨진'문제가 발생할 것으로 예상되는 경우 해당 내용을 배우는 데 매우 감사하게 생각합니다. – PeMa