操作只能在一种类型中进行调度

Mik*_*rek 4 ada accessor gnat

我有一个记录,并希望它的一些访问器功能.

package Some_Package is                                                             

   type A is tagged record                                                          
      First_Field  : Integer;                                                       
      Second_Field : Character;                                                     
   end record;                                                                      

   type B is private;                                                               

   function Some_A (Some_B : B) return A;                                           

private                                                                             

   type B is tagged record                                                          
      Some_A : A;                                                                   
   end record;                                                                      

end Some_Package;
Run Code Online (Sandbox Code Playgroud)

这就是GNAT给我的东西:

some_package.ads:10:13: operation can be dispatching in only one type
Run Code Online (Sandbox Code Playgroud)

对于Ada新手来说,这个错误有点神秘,我会理解我做错了什么,以及如何正确地做到这一点.

Sim*_*ght 10

这是因为ARM 中的特定规则 ; 有两种标记类型(B私有),在Ada中,子程序可以调度其中一个参数或函数结果(实际上,如果所有参数和结果都是相同的标记类型就可以).我认为这是Ada单继承设计的结果.

你真的需要A被标记吗?(我希望这是实际问题代码的简化版本).

如果同时AB需要被标记,对于典型的解决方案function Some_A是使它的参数/结果中的一个类宽(一个类宽参数没有调度):

function Some_A (Some_B : B'Class) return A;
Run Code Online (Sandbox Code Playgroud)

要么

function Some_A (Some_B : B) return A'Class;
Run Code Online (Sandbox Code Playgroud)

从应用的角度来看,取决于哪个更有意义; 猜猜第二,你可以说

The_A : A’Class := Some_A (Some_B => The_B);
Run Code Online (Sandbox Code Playgroud)

顺便说一句,读者会更清楚,如果你说的话,也不会失去太多的封装

type B is tagged private;
Run Code Online (Sandbox Code Playgroud)

  • @Mikolaj:查看Ada Wikibook中的[面向对象](http://en.wikibooks.org/wiki/Ada_Programming/Object_Orientation)一章,[调度](http://en.wikibooks.org/wiki/特别是Ada_Programming/Object_Orientation#Polymorphism.2C_class-wide_programming_and_dynamic_dispatching). (2认同)