Inheritance Ada:标记类型---从父包继承
我试图理解标记类型、代码扩展和重用。我首先创建了一个程序Inheritance Ada:标记类型---从父包继承,inheritance,ada,Inheritance,Ada,我试图理解标记类型、代码扩展和重用。我首先创建了一个程序传统的\u方法\u平均数\u,它实现了一种进行计算的方法。然后,我使用标记类型的扩展并创建第二个程序alternative\u method\u number\u of\u averages,它实现了一种不同的方法来解决相同的问题。不同的是,现在我有了一个附加的参数称为overlapple\u分数。下面是一个简单的程序,使用第一种方法常规方法\u平均数\u,效果很好: 平均数的数量。广告 with Conventional_Method_N
传统的\u方法\u平均数\u
,它实现了一种进行计算的方法。然后,我使用标记类型的扩展并创建第二个程序alternative\u method\u number\u of\u averages
,它实现了一种不同的方法来解决相同的问题。不同的是,现在我有了一个附加的参数
称为overlapple\u分数
。下面是一个简单的程序,使用第一种方法常规方法\u平均数\u
,效果很好:
with Conventional_Method_Number_Of_Averages;
package Number_Of_Averages renames Conventional_Method_Number_Of_Averages;
package Conventional_Method_Number_Of_Averages is
type First_Method is tagged private;
procedure Count_Averages (Any_Method : in out First_Method; Sampling_Frequency, FFT_Size, Time_Recorded: in Float);
function Average_Is (Any_Method : in First_Method) return Float;
private
type First_Method is tagged
record
Number_Of_Averages : Float :=0.0;
end record;
end Conventional_Method_Number_Of_Averages;
with Conventional_Method_Number_Of_Averages;
use Conventional_Method_Number_Of_Averages;
package Alternative_Method_Number_Of_Averages is
type Second_Method is new First_Method with private;
--override this function
procedure Count_Averages (Any_Method : in out Second_Method; Sampling_Frequency, FFT_Size, Time_Recorded, Overlap_Fraction: in Float);
private
type Second_Method is new First_Method with
record
Overlap_Fraction : Float :=0.5;
end record;
end Alternative_Method_Number_Of_Averages;
with Conventional_Method_Number_Of_Averages;
package Number_Of_Averages renames Conventional_Method_Number_Of_Averages;
package Conventional_Method_Number_Of_Averages is
type First_Method is tagged private;
procedure Count_Averages (Any_Method : in out First_Method; Sampling_Frequency, FFT_Size, Time_Recorded: in Float);
function Average_Is (Any_Method : in First_Method) return Float;
private
type First_Method is tagged
record
Number_Of_Averages : Float :=0.0;
end record;
end Conventional_Method_Number_Of_Averages;
with Conventional_Method_Number_Of_Averages;
use Conventional_Method_Number_Of_Averages;
package Alternative_Method_Number_Of_Averages is
type Second_Method is new First_Method with private;
--override this function
procedure Count_Averages (Any_Method : in out Second_Method; Sampling_Frequency, FFT_Size, Time_Recorded, Overlap_Fraction: in Float);
private
type Second_Method is new First_Method with
record
Overlap_Fraction : Float :=0.5;
end record;
end Alternative_Method_Number_Of_Averages;
package body Conventional_Method_Number_Of_Averages is
procedure Count_Averages (Any_Method : in out First_Method; Sampling_Frequency, FFT_Size, Time_Recorded: in Float) is
begin
Any_Method.Number_Of_Averages := (((Sampling_Frequency * Time_Recorded) - FFT_Size)*(2.0/FFT_Size)) + 1.0;
end Count_Averages;
function Average_Is (Any_Method : in First_Method) return Float is
begin
return Any_Method.Number_Of_Averages;
end;
end Conventional_Method_Number_Of_Averages;
with Ada.Float_Text_IO;
with Ada.Text_IO; use Ada.Text_IO;
with Number_Of_Averages;
with Conventional_Method_Number_Of_Averages;
use type Number_Of_Averages.First_Method;
procedure Test_Number_Of_Averages is
Fs, Time_Duration, NFFT : Float := 0.0;
Averages : Float := 0.0;
Good_Method : Conventional_Method_Number_Of_Averages.First_Method;
begin
Ada.Text_IO.Put("Enter the sampling frequency ");
Ada.Float_Text_IO.Get (Item => Fs);
Ada.Text_IO.New_Line (1);
Ada.Text_IO.Put("Enter the time recorded ");
Ada.Float_Text_IO.Get (Item => Time_Duration);
Ada.Text_IO.New_Line (1);
Ada.Text_IO.Put("Enter the FFT size ");
Ada.Float_Text_IO.Get (Item => NFFT);
Ada.Text_IO.Put_Line (Ada.Text_IO.Get_Line);
Ada.Text_IO.New_Line(1);
Ada.Text_IO.Put("Number of averages = ");
Number_Of_Averages.Count_Averages(Good_Method, Fs, NFFT, Time_Duration);
Averages := Conventional_Method_Number_Of_Averages.Average_Is(Good_Method);
Ada.Float_Text_IO.Put (Item => Averages, Fore => 3, Aft => 5, Exp => 0);
end Test_Number_Of_Averages;
package body Alternative_Method_Number_Of_Averages is
--override this function
procedure Count_Averages (Any_Method : in out Second_Method; Sampling_Frequency, FFT_Size, Time_Recorded, Overlap_Fraction: in Float) is
begin
Any_Method.Number_Of_Averages := ((Sampling_Frequency * Time_Recorded) - FFT_Size) / (FFT_Size - Overlap_Fraction * FFT_Size) + 1.0;
end Count_Averages;
end Alternative_Method_Number_Of_Averages;
package body Conventional_Method_Number_Of_Averages is
procedure Count_Averages (Any_Method : in out First_Method; Sampling_Frequency, FFT_Size, Time_Recorded: in Float) is
begin
Any_Method.Number_Of_Averages := (((Sampling_Frequency * Time_Recorded) - FFT_Size)*(2.0/FFT_Size)) + 1.0;
end Count_Averages;
function Average_Is (Any_Method : in First_Method) return Float is
begin
return Any_Method.Number_Of_Averages;
end;
end Conventional_Method_Number_Of_Averages;
with Ada.Float_Text_IO;
with Ada.Text_IO; use Ada.Text_IO;
with Number_Of_Averages;
with Conventional_Method_Number_Of_Averages;
use type Number_Of_Averages.First_Method;
procedure Test_Number_Of_Averages is
Fs, Time_Duration, NFFT : Float := 0.0;
Averages : Float := 0.0;
Good_Method : Conventional_Method_Number_Of_Averages.First_Method;
begin
Ada.Text_IO.Put("Enter the sampling frequency ");
Ada.Float_Text_IO.Get (Item => Fs);
Ada.Text_IO.New_Line (1);
Ada.Text_IO.Put("Enter the time recorded ");
Ada.Float_Text_IO.Get (Item => Time_Duration);
Ada.Text_IO.New_Line (1);
Ada.Text_IO.Put("Enter the FFT size ");
Ada.Float_Text_IO.Get (Item => NFFT);
Ada.Text_IO.Put_Line (Ada.Text_IO.Get_Line);
Ada.Text_IO.New_Line(1);
Ada.Text_IO.Put("Number of averages = ");
Number_Of_Averages.Count_Averages(Good_Method, Fs, NFFT, Time_Duration);
Averages := Conventional_Method_Number_Of_Averages.Average_Is(Good_Method);
Ada.Float_Text_IO.Put (Item => Averages, Fore => 3, Aft => 5, Exp => 0);
end Test_Number_Of_Averages;
package body Alternative_Method_Number_Of_Averages is
--override this function
procedure Count_Averages (Any_Method : in out Second_Method; Sampling_Frequency, FFT_Size, Time_Recorded, Overlap_Fraction: in Float) is
begin
Any_Method.Number_Of_Averages := ((Sampling_Frequency * Time_Recorded) - FFT_Size) / (FFT_Size - Overlap_Fraction * FFT_Size) + 1.0;
end Count_Averages;
end Alternative_Method_Number_Of_Averages;
with Conventional_Method_Number_Of_Averages;
package Number_Of_Averages renames Conventional_Method_Number_Of_Averages;
package Conventional_Method_Number_Of_Averages is
type First_Method is tagged private;
procedure Count_Averages (Any_Method : in out First_Method; Sampling_Frequency, FFT_Size, Time_Recorded: in Float);
function Average_Is (Any_Method : in First_Method) return Float;
private
type First_Method is tagged
record
Number_Of_Averages : Float :=0.0;
end record;
end Conventional_Method_Number_Of_Averages;
with Conventional_Method_Number_Of_Averages;
use Conventional_Method_Number_Of_Averages;
package Alternative_Method_Number_Of_Averages is
type Second_Method is new First_Method with private;
--override this function
procedure Count_Averages (Any_Method : in out Second_Method; Sampling_Frequency, FFT_Size, Time_Recorded, Overlap_Fraction: in Float);
private
type Second_Method is new First_Method with
record
Overlap_Fraction : Float :=0.5;
end record;
end Alternative_Method_Number_Of_Averages;
package body Conventional_Method_Number_Of_Averages is
procedure Count_Averages (Any_Method : in out First_Method; Sampling_Frequency, FFT_Size, Time_Recorded: in Float) is
begin
Any_Method.Number_Of_Averages := (((Sampling_Frequency * Time_Recorded) - FFT_Size)*(2.0/FFT_Size)) + 1.0;
end Count_Averages;
function Average_Is (Any_Method : in First_Method) return Float is
begin
return Any_Method.Number_Of_Averages;
end;
end Conventional_Method_Number_Of_Averages;
with Ada.Float_Text_IO;
with Ada.Text_IO; use Ada.Text_IO;
with Number_Of_Averages;
with Conventional_Method_Number_Of_Averages;
use type Number_Of_Averages.First_Method;
procedure Test_Number_Of_Averages is
Fs, Time_Duration, NFFT : Float := 0.0;
Averages : Float := 0.0;
Good_Method : Conventional_Method_Number_Of_Averages.First_Method;
begin
Ada.Text_IO.Put("Enter the sampling frequency ");
Ada.Float_Text_IO.Get (Item => Fs);
Ada.Text_IO.New_Line (1);
Ada.Text_IO.Put("Enter the time recorded ");
Ada.Float_Text_IO.Get (Item => Time_Duration);
Ada.Text_IO.New_Line (1);
Ada.Text_IO.Put("Enter the FFT size ");
Ada.Float_Text_IO.Get (Item => NFFT);
Ada.Text_IO.Put_Line (Ada.Text_IO.Get_Line);
Ada.Text_IO.New_Line(1);
Ada.Text_IO.Put("Number of averages = ");
Number_Of_Averages.Count_Averages(Good_Method, Fs, NFFT, Time_Duration);
Averages := Conventional_Method_Number_Of_Averages.Average_Is(Good_Method);
Ada.Float_Text_IO.Put (Item => Averages, Fore => 3, Aft => 5, Exp => 0);
end Test_Number_Of_Averages;
package body Alternative_Method_Number_Of_Averages is
--override this function
procedure Count_Averages (Any_Method : in out Second_Method; Sampling_Frequency, FFT_Size, Time_Recorded, Overlap_Fraction: in Float) is
begin
Any_Method.Number_Of_Averages := ((Sampling_Frequency * Time_Recorded) - FFT_Size) / (FFT_Size - Overlap_Fraction * FFT_Size) + 1.0;
end Count_Averages;
end Alternative_Method_Number_Of_Averages;
Any_Method.Number_Of_Averages := ((Sampling_Frequency * Time_Recorded) - FFT_Size) / (FFT_Size - Overlap_Fraction * FFT_Size) + 1.0;
那么如何解决这个问题呢
最后,我希望能够有这样的东西:
Number_Of_Averages.Count_Averages(Alternative_Method, Fs, NFFT, Time_Duration, Overlap_fraction);
在测试文件中,测试\u平均值的数量\u.adb,与工作代码类似
Number_Of_Averages.Count_Averages(Good_Method, Fs, NFFT, Time_Duration);
非常感谢
更新
因此,现在对于替代方法的实施,我将替代方法\u平均数\u.ads/adb重命名为传统方法\u平均数\u-替代方法\u平均数\u.ads/adb。测试文件为:
with Ada.Float_Text_IO;
with Ada.Text_IO; use Ada.Text_IO;
with Number_Of_Averages;
with Conventional_Method_Number_Of_Averages;
use type Number_Of_Averages.First_Method;
with Conventional_Method_Number_Of_Averages.Alternative_Method_Number_Of_Averages;
procedure Test_Number_Of_Averages is
Fs, Time_Duration, NFFT : Float := 0.0;
Averages1 : Float := 0.0;
Averages2 : Float := 0.0;
Good_Method : Conventional_Method_Number_Of_Averages.First_Method;
Alternative_Method : Conventional_Method_Number_Of_Averages.Alternative_Method_Number_Of_Averages.Second_Method;
begin
Ada.Text_IO.Put("Enter the sampling frequency ");
Ada.Float_Text_IO.Get (Item => Fs);
Ada.Text_IO.New_Line (1);
Ada.Text_IO.Put("Enter the time recorded ");
Ada.Float_Text_IO.Get (Item => Time_Duration);
Ada.Text_IO.New_Line (1);
Ada.Text_IO.Put("Enter the FFT size ");
Ada.Float_Text_IO.Get (Item => NFFT);
Ada.Text_IO.Put_Line (Ada.Text_IO.Get_Line);
Ada.Text_IO.New_Line(1);
Ada.Text_IO.Put("Number of averages = ");
Number_Of_Averages.Count_Averages(Good_Method, Fs, NFFT, Time_Duration);
Averages1 := Conventional_Method_Number_Of_Averages.Average_Is(Good_Method);
Ada.Float_Text_IO.Put (Item => Averages1, Fore => 3, Aft => 5, Exp => 0);
Ada.Text_IO.New_Line(1);
Ada.Text_IO.Put("Number of averages = ");
Number_Of_Averages.Alternative_Method_Number_Of_Averages.Count_Averages(Alternative_Method, Fs, NFFT, Time_Duration);
Averages2 := Conventional_Method_Number_Of_Averages.Alternative_Method_Number_Of_Averages.Average_Is(Alternative_Method);
Ada.Float_Text_IO.Put (Item => Averages2, Fore => 3, Aft => 5, Exp => 0);
end Test_Number_Of_Averages;
当Fs=48000,Time_Duration=60,NFFT=8192时,两种方法都返回702.125。尽管如此,第二种方法始终返回702.125,而与
重叠部分
参数无关。如何在调用函数中指定Overlap\u分数
,同时仍保持使用它的私有性,即通过让函数使用存储在记录中的Overlap\u分数
的值。在替代方法\u平均数\u
的正文中,您试图使用平均数\u
,它是父类型的私有成员。既然是私人的,
你看不见它
使用包时,只能看到规范的公共部分
子包在其自己的公共部分中可以看到父包的公共部分,在其自己的私有部分中可以看到父包的私有部分
还有私有child,它们在自己的规范中可以看到整个父对象
要查看平均数的数量
,您可以将完整的类型声明移动到公共部分,或者将替代方法
作为常规方法
的子包
有关更多详细信息,请参阅:
另一方面,只有当类型扩展使用与父类中相同的参数配置文件实现子程序时,才会发生重写。在您的示例中,
Second\u方法
重载了Count\u平均值
,即添加一个名称相同但配置文件不同的新子程序<代码>计数\u平均值仍然从具有较短参数配置文件的父级继承。@egilhh。谢谢如何使替代方法的平均数成为常规平均数的子包?我更愿意将平均数保密。1投赞成票。将包名称更改为:“包常规方法平均数。替代方法平均数为”。您可能还需要更改文件名。@谢谢。我做了必要的修改,但是替代方法的结果是零,这是不对的(尽管公式是好的)。我已经更新了帖子。我没有看到为替代方法计算平均值的调用,因此Average只会返回默认值Number of of of the the the of the of the the the of the of the the the the Averages,即0.0。@egilhh Yes您是对的。我把平均值的个数。可选方法平均值的个数。计数平均值(可选方法,Fs,NFFT,时间持续时间)代码>但我得到的值是相同的702.125,与重叠部分
的值无关。因此,仍有一些问题无法解决。