oop - Ada - 如何初始化包含 File_Type 成员的有限标记类型?

标签 oop inheritance syntax ada

在下面的代码中,Mix_Card_Reader 继承自 Mix_IO_Device,后者是一个抽象的标记记录。

以前它包含一个 Positive和两个 Stream_Access成员。我想更改代码以使其使用 File_Type成员代替。

这样做的原因是我希望这种类型的每个实例都能够在需要时打开和关闭其文件,或者如果需要则根本不打开和关闭其文件。

问题是我无法初始化这个继承类型,因为 File_Type是有限的类型。如何写我的Create_Mix_Card_Reader允许这样做的功能?

.ads...


   type Mix_IO_Device is abstract tagged limited
      record
         Block_Size : Positive;
         Input_File : File_Type;
         Output_File : File_Type;
      end record;

   type Mix_Card_Reader is new Mix_IO_Device with null record;

.adb...


   function Create_Mix_Card_Reader return Mix_IO_Device_Access is
      Ret : Mix_IO_Device_Access := new Mix_Card_Reader'(16, null, null);
   begin
      return Ret;
   end Create_Mix_Card_Reader;

GNAT 提示我无法通过 null, null成对File_Type成员,因为它们当然是不兼容的,所以 null 是从它曾经有 Stream_Access 时遗留下来的。成员。似乎我必须在这里传递一些东西,但我不想为了安抚编译器而过早地打开文件。

该怎么办?

编辑:
我有几个明显的选择:
  • 使用 access File_Type相反(但我仍然必须在其他地方维护文件的打开/关闭)。
  • 将所有 File_Type 对象分别存储在一个数组中,并像以前一样使用 Streams 来引用它们,但这看起来很困惑。
  • 最佳答案

    这应该可以解决问题:

    function Create_Mix_Card_Reader return Mix_IO_Device_Access is
       Ret : Mix_IO_Device_Access := new Mix_Card_Reader'(
         16, Input_Type => <>, Ouptut_Type => <>);
    begin
       return Ret;
    end Create_Mix_Card_Reader;
    

    方框表示法是默认值的占位符。您至少需要 Ada 2005 才能在聚合中使用它,并且不能使用位置符号,详细信息在 Ada 2005 Rationale 中进行了解释。 .您可以将这两个分配缩短为 others => <>如果你想。

    关于oop - Ada - 如何初始化包含 File_Type 成员的有限标记类型?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/58789197/

    相关文章:

    java - 不确定要在对象字符串变量中放入什么

    java - 什么时候使用不同的类?

    css - 子div是否继承 parent 的高度?

    c# - 我是否需要序列化抽象基类以使派生类可序列化

    Mysql触发器语法错误(MySql Error?)

    r - 我可以阻止通过 R 中的 NextMethod 传递参数吗?

    php - 如何在php中使用命名空间类

    java - 为什么不能实现类将重写方法定义为静态的?

    jquery - 有没有更短的方法来编写这个脚本? (针对多个元素运行相同的功能)

    php - PHP 中单引号和双引号字符串有什么区别?