在下面的代码中,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
相反(但我仍然必须在其他地方维护文件的打开/关闭)。 最佳答案
这应该可以解决问题:
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/