2014-09-02 3 views
0

문제는 파생 형식에서 기본 형식의 멤버 이름을 바꾸는 것이 문제입니다. 나는 FORTRAN이 포인터와 연관 함수를 제공 한 이후로 할 수 있다고 생각한다. 예를 들어 :FORTRAN : 파생 된 형식의 멤버 이름 바꾸기

type :: base1 
    integer :: old 
endtype base1 

type, extends(base1) :: derived1 
    !here I want old to be renamed as new 
    !Something like new=> old 
    !So I can use derived1%new elsewhere 
endtype derived1 

그러나 문제는 대상이 될 수없는 오래된 base1 %이다. 그래서 포인터를 사용하여 그것을 할 수 없다고 생각합니다. 나는 동료를 둘 곳을 모른다. 어떤 제안? 감사!

답변

3

언어는 부모 유형에서 상속 된 구성 요소의 이름 바꾸기를 제공하지 않습니다.

오버로드 된 구조 생성자 또는 유사 항목에서 부모 유형의 구성 요소에 확장 유형의 포인터 구성 요소를 개념적으로 연결할 수는 있지만 많은 함정이 있습니다. 확장 된 형태의 구성 요소의 포인터 협회

  • 오브젝트는 항상 (그 자체가 포인팅 될 필요하거나 상위 성분) 타겟 특성을 가질 필요가 과부하 구조 생성자 외부 유효 할 .

  • 개체의 값이 복사 될 때마다 (할당보다 광범위한 - VALUE 및 SOURCE = 지정자를 ALLOCATE로 간주 할 때) 확장 된 형식의 포인터 구성 요소를 복사본에 다시 연결해야합니다.

나는이 길을 걷지 않을 것이다.


개념적으로 상위 유형의 구성 요소가 공용 인 경우 구성 요소는 상위 유형의 인터페이스 일부입니다. 유형 확장은 확장 유형이 상위 유형의 인터페이스의 수퍼 세트를 가지고 있음을 의미하지만 구성 요소의 원하는 이름 변경은 원하지 않는 것으로 나타냅니다. 확장 된 유형의 인터페이스가 상위 유형의 상위 집합이되지 않도록하려면 확장 유형이 상위의 확장이 아니어야합니다. 어쩌면 현재 확장 된 유형이 현재의 유형으로 만드는 것이 더 나을 것입니다. 부모는 확장 된 형태의 통상의 컴퍼넌트를 입력합니다.

+0

설명해 주셔서 감사합니다. 나는 마지막 단락을 잘 이해하지 못한다. 확장 된 형식은 기본 형식의 상위 집합이라는 것을 알고 있습니다. 어쨌든 이름 바꾸기가 끝난 경우 확장 유형은 더 이상 기본 유형의 상위 집합이 아니라고 가정합니다. 그러나 동일한 변수에 대해 두 개의 이름은 어떻게됩니까? 개념적으로, 확장 된 타입이 기본 멤버의 포인터를 가지고 있다면, 확장 된 타입은 여전히 ​​기본 타입의 수퍼 셋입니다. 맞습니까? 따라서 확장 된 유형은 기본 유형에서 정의 된 멤버 중 하나의 새 이름으로 모든 것을 상속합니다. 좀 더 설명해 주시겠습니까? – FortCpp

+0

@FortCpp IanH가 의미하는 것은'type (derived1) :: new' 컴포넌트로'type :: derived1'을 선언하는 것입니다. 'old'는'derived1 % new % old'로 액세스 될 것입니다. – PetrH

+0

기존 이름과 병렬로 새 이름을 사용한 경우 - 예 - 상위 유형의 인터페이스를 유지 관리하고 있습니다. 감사합니다 IanH. – IanH