如果類型T有一個原始子程序,並且您說「類型T2是新的T」或「類型T2是新的T ...」,則會隱式聲明新的子程序。在新的子程序中,如果任何參數類型爲T
或access T
,則將其替換爲T2
或access T2
;如果它是返回類型爲T
或access T
的函數,則返回類型將被類似替換。
如果沒有涉及的private
類型或擴展名,則新子程序將在派生類型之後隱式聲明。例如: -
type U is tagged null record ;
procedure m1 (P1 : U; P2 : in out U; P3 : Integer) ;
procedure m2 (P1 : Float ; P2 : in out U) ;
type W is new U with null record ;
-- procedure m1 (P1 : W; P2 : in out W; P3 : Integer) ; --implicitly declared
-- procedure m2 (P1 : Float ; P2 : in out W) ; --implicitly declared
procedure m2 (P1 : Float ; P2 : Boolean ; P3 : in out W);
-- this last is a *new* procedure. It doesn't override the other m2 because
-- it has a new Boolean parameter. Instead, it's an example of *overloading*.
-- So now W has three primitive operations, two that were inherited and one that
-- is brand new.
type X is new W with null record ;
-- procedure m1 (P1 : X; P2 : in out X; P3 : Integer) ; --implicitly declared
-- procedure m2 (P1 : Float ; P2 : in out X) ; --implicitly declared
-- procedure m2 (P1 : Float ; P2 : Boolean ; P3 : in out X); --implicitly declared
-- All three of W's primitive operations, including the implicitly declared ones,
-- are inherited for X.
的with private
不會改變的東西太多,但它的變化,其中隱含的子程序聲明的一點。我相信它們是在完整的類型定義之後聲明的,它將位於包的私有部分。這意味着除了程序中可以看到包的私有部分的地方之外,它們是不可見的。 (但是,他們可能還是可以通過調度運行調用。)
編輯:對於with private
情況下,繼承的子程序的可見性由RM 7.3.1(7)決定:
對於private_extension_declaration,每個繼承子程序在private_extension_declaration後立即聲明,如果來自祖先的相應聲明在該位置可見。否則,繼承的子程序沒有爲私有擴展聲明,儘管它可能是完整的類型。
因此:
package P is
type U is tagged private;
procedure M1 (P1 : U; P2 : in out U; P3 : Integer);
procedure M2 (P1 : Float ; P2 : in out U);
type W is new U with private;
--procedure M1 (P1 : W; P2 : in out W; P3 : Integer); -- implicitly declared
--procedure M2 (P1 : Float ; P2 : in out W); -- implicitly declared
private
type U is ... -- full type definition
type W is new U with ... -- full type definition
end P;
的M1
和M2
的聲明是在其中W
首先聲明的點可見;因此它們在那時被繼承。由於該點在P的公共部分,因此可以通過任何包含with P
的包引用它們。但是:
package P is
type U is tagged private;
type W is new U with private;
procedure M1 (P1 : U; P2 : in out U; P3 : Integer);
procedure M2 (P1 : Float ; P2 : in out U);
private
type U is ... -- full type definition
type W is new U with ... -- full type definition
--procedure M1 (P1 : W; P2 : in out W; P3 : Integer); -- implicitly declared
--procedure M2 (P1 : Float ; P2 : in out W); -- implicitly declared
end P;
的M1
和M2
的聲明是在哪裏W
首先聲明,因爲它們還沒有被見過的點不可見。因此,他們而不是在那一點上繼承。但隱式聲明稍後會被繼承,當看到完整類型時。但是,這些隱式聲明位於P
的private
部分;因此,只能在可看到P
的部分P
,即P
的身體以及P
的兒童包裝中的適當位置的程序的部分中直接調用它們(即,不通過調度)。
來源
2014-01-30 17:01:30
ajb