我有一個通用的包裝Containers.Stacks
看起來大致是阿達通用包擴展
generic
type Value_Type is private;
package Containers.Stacks with Preelaborate is
--Node stuff
type Stack is new Container with private;
--Other Stack stuff
--Private stuff
end Containers.Stacks;
一切有關的(似乎)工作得很好。我想重用這個實現來創建一個擴展但更窄的目的棧。我想出了以下內容:
問題的關鍵是,我不希望有重新實現所有公共堆棧的東西,只爲特定整數堆棧。這是有效的,但留下了一個醜陋而奇怪的Containers.Integer_Stacks.Stack
和Containers.Integer_Stacks.Stacks.Stack
,我想避免它。然而,試圖將包初始化放在私有部分中,也隱藏了所有的子例程。有沒有辦法做到我想做的事,或者說用戶必須要處理的兄弟包初始化存在一個更合適的方法?
替代做法: 我發現這是可能的定義的Containers.Stacks
子包稱爲Containers.Stacks.Integer
像這樣:
generic
with function "+"(Left, Right: Value_type) return Value_Type is <>;
package Containers.Stacks.Integer is
procedure Add(Self : in out Stack);
end Containers.Stacks.Integer;
而這個工作。除了現在我不能撥打Stack.Add
,我不得不打電話給Add(Stack)
。
「試圖將包初始化private部分,但是,也隱藏了所有的子程序。」 –
是的。這就是完成這一點的原因,正如你寫的那樣,你想創建一個「狹義目標堆棧」。您仍然可以從「Containers.Stacks.Stack」中爲您的「窄目標棧」製作公開版本的操作。 –