限制功能由Ada中的特定其他功能调用

时间:2010-10-12 12:15:28

标签: ada nested

假设我有一个我想要仅通过另一个特定程序调用的过程。是否可以强制限制该过程,以便它只能由指定的调用过程引用?真的我想知道的是,是否有另一种编写代码的方法,这样你就不必在程序中嵌套/嵌入程序,以强制限制范围。

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

编辑:这是针对Ada Code btw。

3 个答案:

答案 0 :(得分:4)

不(一般来说)。

公共过程是一个公共过程,所以它可以被任何“with”它(如果它是一个独立的过程)或声明它的包调用。

如果有任何方法可能适合您的实施方法,有几种方法可以限制其可见性:

  • 在包的私有部分或包体内声明过程。然后,只有该包中的子程序才能访问它。
  • 将供应包或子程序声明为private,然后那些'with'的包只能在其私有部分或包体中引用供应单位的内容(包括调用其子程序)。
  • “私有”供应包,因此它只能在其私有部分/包体内引用包。

但是像T.E.D.说,使用语言工作并利用其功能,而不是尝试重新创建其他语言的构造。

答案 1 :(得分:3)

好吧,如果您将procedure one单独放入一个包中并将procedure two放入其private部分,那么其他任何例程都无法调用它(除非写入包裹或儿童包裹。)

您还可以使用其中包含procedure one特定数据的标记类型,并将procedure two放入其包中,并将该类型的对象作为参数。其他人可能会调用procedure two,但不会调用procedure one的对象。

我有点困惑,为什么你想要重新创建Ada的范围行为,而不使用范围。接受这种语言。

答案 2 :(得分:1)

我有两个可能的建议。第一个有点奇怪,有点偏离主题,但我想提出它,以防你不知道,因为大多数答案都与隐藏代码的可见性或改变关系有关

  1. 您可以考虑使用Ada Tasking功能并使用“来电者属性”。通常这仅用于任务,然后“调用者”名称仅表示接收任务的调用任务。但是,一旦进入接收任务的条目,您就可以使用呼叫者姓名快速结束或以其他方式将呼叫者标记为错误或不是您预期的呼叫者。这基本上将“门卫”放入任务条目中,然后可以决定让他们继续,将呼叫者重新排队到不同的条目,或者做其他事情。但是,如果您的任务正在消耗来自其他任务的已发布调用,那么这只会真正起作用。这是我在Ada中唯一知道的,你可以在运行时检测到谁给你打电话并做了些什么。

  2. 然而你的问题似乎想要使用范围,所以我同意这里所说的内容并且只在Ada中添加它是正常的有嵌套程序(为了可读性)但除此之外你可以考虑创建子包并反向使用层次结构。这是将孩子暴露给程序员并使父母只能从孩子那里访问。设计父级的范围非常有限,这样父级的公共规范对于没有父级规范私有视图的任何调用者来说都是完全没价值的。这样你就可以分离,只有孩子可以访问父母中的函数,并且实际上可以调用它们,因为它们具有父类型和函数定义的完整视图。

  3. 祝你好运。