2010-10-12 40 views
1

假設我有一個過程,我只想通過另一個特定過程調用。是否可以對該過程強制限制,以便只能通過指定的調用過程來引用它?真的,我想知道的是,是否有另一種編寫代碼的方法,以便您不必在程序中嵌套/嵌入過程,以強制有限的範圍。Ada中的特定其他函數將調用的限制函數

procedure one 
    procedure two 
    begin 
     blah 
    end two; 
begin 
end one; 

編輯:這是爲阿達碼btw。

回答

4

否(一般來說)。

公共過程是一個公共過程,因此它可以由任何「帶有」它(如果它是獨立過程)或它聲明的包中調用。

有幾種方法來約束其知名度,如果任何一個可能適合您的實現方法:

  • 聲明在包的私有部分的程序,或包裝體內。那麼只有該包中的子程序才能訪問它。
  • 聲明供應包或子程序爲private,那些'帶'的包只能在其私有部件或包體內引用供應單元的內容(包括調用其子程序)。
  • 「Private with」提供程序包,因此它只能引用其私人部件/程序包體內的程序包。

但是像T.E.D.說,工作語言和利用其功能,而不是試圖重新創建一些其他語言的結構。

3

那麼,如果你要把procedure one放在一個包中,並把procedure two放在它的private部分,那麼沒有其他例程能夠調用它(除非寫入到包或子包中)。

你也可以做一個標記類型與特定於它procedure one任何數據,並把procedure two在其包裝與該類型作爲參數的對象。然後其他人可能會撥打procedure two,但不能撥打procedure one的對象。

我有點困惑,爲什麼你想重新創建Ada的範圍行爲而不使用範圍確定。擁抱語言。

+0

我想我真的不喜歡嵌入代碼很多,在這種情況下製作額外的包真的不起作用。把3個程序分成20行,例如在一行50行內的程序看起來很麻煩......我希望有一種「乾淨」的方式來做到這一點,比如也許在闡述部分聲明函數,然後定義它其他地方,但它看起來不像那些作品 – onaclov2000 2010-10-12 13:28:36

+0

我已經到了我真正喜歡它的地方,並且對其他不允許它的語言感到惱火。順便說一句:直到你在一個子程序中嵌入了一個**任務**之後,你纔會活着。 :-) – 2010-10-12 14:58:10

1

我有兩個可能的建議。第一個是有點奇怪和題外話了一點,但我希望把它在你不知道,因爲大部分的答案有隱藏代碼的可見性或變化的關係

  1. 你做的情況下,可以考慮使用Ada Tasking功能並使用「來電者屬性」。通常這只是爲了任務,然後「呼叫者」名稱僅表示對接收任務的呼叫任務。但是一旦進入接收任務條目,您就可以使用呼叫者名稱快速結束或以其他方式將呼叫者標記爲錯誤或不是您期望的呼叫者。這基本上在任務條目中放置了一個「門衛」,然後可以決定讓他們繼續,讓來電者重新進入不同的條目,或者做其他事情。但是,如果您有任務使用來自其他任務的已發佈調用,這隻會真的起作用。這是我在Ada中唯一知道的,你可以在運行時檢測到誰在給你打電話並做些什麼。

  2. 但是你的問題似乎想要使用範圍,所以我會同意這裏所說的,只是在Ada中這是一個正常的嵌套過程(爲了可讀性),但除此之外,你可以考慮創建子包並反向使用層次結構。這就是將孩子暴露給程序員,並讓父母只能從孩子那裏進入。設計家長的範圍是非常有限的,這樣父母的公開規範對任何沒有父母規範的私人觀點的調用者來說都是毫無價值的。這樣你就有了分離,只有小孩可以訪問父項中的函數,並且可以實際調用它們,因爲它們具有父類型和函數定義的完整視圖。

祝你好運與您的問題。

相關問題