2010-10-12 20 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中这是一个正常的嵌套过程(为了可读性),但除此之外,你可以考虑创建子包并反向使用层次结构。这就是将孩子暴露给程序员,并让父母只能从孩子那里进入。设计家长的范围是非常有限的,这样父母的公开规范对任何没有父母规范的私人观点的调用者来说都是毫无价值的。这样你就有了分离,只有小孩可以访问父项中的函数,并且可以实际调用它们,因为它们具有父类型和函数定义的完整视图。

祝你好运与您的问题。

相关问题