2016-11-14 1 views
1

Ada Generic 패키지에 넣은 요소가있는 패키지가있는 경우 패키지가 작동 중임을 보여주고 싶다면 Integer를 표시하기 위해 두 개의 개별 클라이언트 프로그램을 실행해야하며 Float, 아니면 같은 프로그램에서 모두 할 수 있을까요?Ada 제네릭 패키지에서

+1

당신은 일반적인 패키지에게 많은 시간을 인스턴스화 할 수 있습니다 :

때때로, 그것은 하나는 외부 제네릭의 형식 매개 변수함으로써 "내부 일반적인"에 대한 요구 사항을 지정할 수 있다는 점을 고려 가치가있다 하나의 프로그램에서 서로 다른 유형의 다른 일반 매개 변수를 사용하고자합니다. 각각은 고유 한 이름을 가지고 있으므로 애매 모호해서는 안됩니다. –

+0

하지만 Ada.Integer_Text_IO가 있다고 가정 해 보겠습니다. 프로그램 전체를 통해 정수 또는 부동 소수점을 어떻게 고정 할 것입니까? –

+0

Ada.Float_Text_IO는 float을 수행합니다. 둘 다 "함께"할 수 있습니다. 그런 다음 Put (2.0)은 Put (2)가 다른 함수를 호출하는 동안 하나의 함수를 호출합니다. –

답변

1

일반 매개 변수에는 패키지로 전달되는 일반 데이터 형식을 인쇄하기위한 일반 프로 시저 매개 변수가 포함되어야합니다. 이렇게하면 데이터 유형을 아무 것도 될 수 없으며 제네릭 패키지의 작성자는 출력 방법에 관심을 가질 필요가 없습니다.

generic 
    type element_type is private; 
    with procedure Print(Item : element_type); 
package gen_pack is 
    ... 
end gen_pack; 
0

IIUC은 "내부"패키지는, 너무, 적어도 지금까지 테스트가 간다, 외부 패키지의 일반적인 형식 유형에 따라 달라 하나입니다. 그런 다음 두 가지 경우가 있습니다.

  1. 내부 패키지는 Integer_Text_IO으로, 그것은 단지 불똥이 튄 정수 타입을 처리 할 수있는 일반 패키지,이다, 그리고 그 컴파일 타임 일이 있다면.

  2. 내부 패키지는 외부 generic 패키지의 일반 형식 유형을 사용하여 인스턴스화 할 수있는 종류입니다. Integer_Text_IO 포인트 피연산자 부동 위해 만든되지 않기 때문에 첫 번째 경우

는, 컴파일러는 할 수 있지만 거부 할 수있는 건 아무것도 없다. 따라서 별도의 테스트 케이스를 설정해야합니다.

두 번째 경우 결과는 "내부 인스턴스"에 따라 달라집니다. 컴파일러는 유형이 주어지면 일반 패키지를 만들 수 없기 때문에 존재하는 일반 패키지 만 인스턴스화 할 수 있습니다. 후자는 일치하는 공식 요구 사항을 가져야합니다. 즉, 외부 제네릭 및 인스턴스화 된 내부 제네릭의 일반 형식 유형이 일치해야합니다. 즉, range <>digits <>과 같이 상호 배타적 인 범주에 속하지 않아야합니다.

generic 
    type X (<>) is limited private; 
package Taking_Any is 
    -- ... operations for both FPT and integer types 
end Taking_Any; 

generic 
    type T is private; 
    with package Works_With_Any is new Taking_Any (<>); 
package Outer is 
    package Any_Instance is new Taking_Any (T); 
end Outer;