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;
    
  • 常规方法\u平均数\u。ads

    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;
    
  • 常规方法\u平均数\u。adb

    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;
    
  • 以及测试文件测试平均值的数量。adb

    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;
    
  • 上述方法可以正常工作

    现在,如果我为相同的计算创建一个替代方法,我有:

  • 其规格替代方法\u平均数\u。ads

    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;
    
  • 其主体替代方法\u平均数。adb

    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;
    
  • 然后在编译规范文件时,我得到错误消息:

    备选方法\u平均数\u.ads:对于在备选方法\u平均数\u.ads中定义的类型“第二种方法”,没有选择器“备选方法\u平均数”。罪魁祸首是:

         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,与
    重叠部分
    的值无关。因此,仍有一些问题无法解决。