一般問題:是否可以覆蓋記錄字段?覆蓋記錄字段
作爲一個簡單的例子,我想要一個Long_Integer字段,但外部世界應該只能夠將其設置爲Integer。
package A is
type B is record // edit: should be tagged to be able to use my intention below
c : Long_Integer;
end record;
end A;
X : B;
我可以假,我打算通過使用下面的函數/過程:
function d (Object : B) return Integer is (Integer (Object.c));
procedure d (Object : B; Value : Integer) is
begin
Object.c := Long_Integer (Value);
end d;
所以,我可以用X.d獲得的價值和X.d()來設置值。
但是,是否有可能用給定的函數和過程覆蓋字段「c」,並且更有趣,我可以重寫它,以便我可以使用Xc:= Integer(3)來設置字段的值?
編輯:
test.adb
with Ada.Text_IO;
with A;
procedure Test is
use A;
X : C;
begin
X.d (123);
Ada.Text_IO.Put_Line("Value is " & X.d'Img);
end Test;
a.adb
package body A is
function d (Object : C) return Integer is (Integer (Object.d));
procedure d (Object : in out C; Value : Integer) is
begin
Object.d := Long_Integer (Value);
end d;
end A;
一個。廣告
package A is
type B is tagged private;
type C is tagged private; -- tagged missed
type C_Access is access all C; <-- is this line correct?
function d (Object : C) return Integer;
procedure d (Object : in out C; Value : Integer);
private
type B is tagged null record;
type C is new B with record
d : Long_Integer;
end record;
end A;
編譯器說: test.adb:9:04:在選定的組件無效前綴 「X」 test.adb:10:39:在選定的組件無效前綴 「X」
你看,爲什麼?
將'C'聲明爲'C類型標記爲private;'。 'Object.procedure(...)'或'Object.function(...)'符號只有在對象被標記時才被允許,並且從'test.adb'中的那個點只能看到'type C是私有的; ',不允許知道「C」類型被標記。 – ajb
謝謝你們兩位:-) – user1091344
@ajb,@'Brian Drummond':還有一個問題:-) C_Access類型,這是正確的還是我應該將它移入私有部分? – user1091344