我希望你能给我建议。我第一次尝试使用 ADA 95 的面向对象功能,并且我想要两个派生类 cyclicgroup 和 polyggroup 来调用属于它们的基类 abstractGroup 的 put() 方法。但是编译器并没有像我预期的那样跟踪类层次结构,而是告诉我在对 put() 的调用中存在类型不匹配。如何告诉编译器识别对象之间的连接?
以下是 5 个文件,删除了所有无关的内容,并尝试编译:
grpdriver2.adb:
与 Ada.Text_IO;使用 Ada.Text_IO;使用 Ada.Command_Line;使用 Ada.Command_Line;
与groupstuff2;与 subgrphandler2;
procedure grpdriver2 is
cycg: groupStuff2.cyclicgroup;
polyg: groupStuff2.polygonGroup;
begin
cycg := groupstuff2.createCyclicGroup( 10);
subgrphandler2.put(cycg); -- line 13
------------------------------------------------------------------------------------------------------------------
polyg := groupstuff2.createPolygonGroup( 10);
subgrphandler2.put(polyg); -- line 18
end grpdriver2;
..................................................... ..................................................... ......
groupstuff2.ads:
与 Ada.Text_IO;使用 Ada.Text_IO;使用 Ada.Command_Line;使用 Ada.Command_Line;
包 groupstuff2 是
type abstractGroup is tagged record
x: integer;
end record;
type cyclicGroup is new abstractGroup with record
y: integer;
end record;
function createCyclicGroup( size: in integer) return cyclicGroup ;
----------------------------------------
type polygonGroup is new abstractGroup with record
null;
end record;
function createPolygonGroup( size: in integer) return polygonGroup ;
端组材料2;
..................................................... .....................................
groupstuff2.adb:
包体groupstuff2是
procedure put( g: in abstractGroup) is
x: integer;
begin
x := 1;
end put;
function createCyclicGroup( size: in integer) return cyclicGroup is
cycg: cyclicGroup;
begin
cycg.x := size;
return cycg;
end createCyclicGroup;
function createPolygonGroup( size: in integer) return polygonGroup is
polyg: polygonGroup;
begin
polyg.x := size;
return polyg;
end createPolygonGroup;
端组材料2;
..................................................... ......................
subgrphandler2.ads:
与 Ada.Text_IO;使用 Ada.Text_IO;使用 Ada.Command_Line;使用 Ada.Command_Line;
与groupstuff2;
包 subgrphandler2 是
procedure put( g: in groupStuff2.abstractGroup);
结束子控制器2;
..................................................... .........................................................
subgrphandler2.adb:
包体 subgrphandler2 是
procedure put( g: in groupStuff2.AbstractGroup) is
begin
put("THIS IS A PUT STATMENT");
end put;
结束子控制器2;
编译尝试:
C:\GNAT\2018\bin\ceblang>gnatmake grpdriver2 gcc -c grpdriver2.adb grpdriver2.adb:13:36:预期类型“abstractGroup”定义在 groupstuff2.ads:7 grpdriver2.adb:13:36:找到类型“ cyclicGroup”定义在 groupstuff2.ads:16 grpdriver2.adb:18:36:预期类型“abstractGroup”定义在 groupstuff2.ads:7 grpdriver2.adb:18:36:发现类型“polygonGroup”定义在 groupstuff2.ads:25 gnatmake :“grpdriver2.adb”编译错误