title: How to implement interface in Ada?
body: <p>Dont know what this oop pattern is called but how can I do the same pattern in Ada?
  For example this code:</p>
  
  <pre><code>interface Vehicle{
      string function start();
  }
  
  class Tractor implements Vehicle{
      string function start(){
          return "Tractor starting";
      }
  }
  class Car implements Vehicle{
      string function start(){
          return "Car  starting";
      }
  }
  
  class TestVehicle{
      function TestVehicle(Vehicle vehicle){
          print( vehicle.start() );
      }
  }
  new TestVehicle(new Tractor);
  new TestVehicle(new Car);
  </code></pre>
  
  <p><strong>my failed attempt in Ada:</strong>
  How to fix it properly?</p>
  
  <pre><code>with Ada.Text_IO;
  
  procedure Main is
  
     package packageVehicle is
        type Vehicle is interface;
        function Start(Self : Vehicle) return String is abstract;
     end packageVehicle;
  
     type Tractor is new packageVehicle.Vehicle with null record;
     overriding -- optional
     function Start(Self : Tractor) return string is
     begin
        return "Tractor starting!";
     end Start;
     type Car is new packageVehicle.Vehicle with null record;
     overriding -- optional
     function Start(Self : Car) return string is
     begin
        return "Car starting!";
     end Start;
  
  
     procedure TestVehicle(Vehicle : packageVehicle.Vehicle) is
     begin
        Ada.Text_IO.Put_Line( "Testing a vehicle" );
        Ada.Text_IO.Put_Line( Start(Vehicle) );
     end;
  
     Tractor0 : Tractor;
     Car0 : Car;
  
  begin
  
     Ada.Text_IO.Put_Line( TestVehicle(Tractor0) );
     Ada.Text_IO.Put_Line( TestVehicle(Car0) );
  
  end Main;
  </code></pre>
  
  <p>Compiler says:
  Builder results warning: declaration of "TestVehicle" is too late
  Builder results warning: spec should appear immediately after declaration of "Vehicle"</p>