2013-05-04 8 views
5

यह नहीं पता कि इस ओप पैटर्न को क्या कहा जाता है लेकिन मैं एडा में एक ही पैटर्न कैसे कर सकता हूं? उदाहरण के लिए इस कोड:एडीए में इंटरफ़ेस को कैसे कार्यान्वित करें?

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); 

मेरी एडीए में असफल प्रयास: कैसे इसे ठीक तरह से ठीक करने के लिए?

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; 

संकलक का कहना है: बिल्डर परिणाम चेतावनी: "TestVehicle" की घोषणा बहुत देर हो चुकी है बिल्डर परिणाम चेतावनी: कल्पना "वाहन" की घोषणा

+0

मुझे इंटरफेस के बारे में निश्चित नहीं है, लेकिन मुझे पता है कि आधार/पैरेंट पैकेज को गतिशील प्रेषण के साथ एक अलग पैकेज फ़ाइल में होना आवश्यक है। –

उत्तर

6

मुख्य बात में इंटरफेस के बारे में अधिक पढ़ सकते हैं एक इंटरफ़ेस प्रकार के आदिम उपप्रोग्राम सार उपप्रोग्राम या शून्य प्रक्रियाएं होंगी। " (Ref) आईई। आप एक उपप्रोग्राम को परिभाषित नहीं कर सकते जो इंटरफ़ेस को पैरामीटर के रूप में लेता है (हाँ, मुझे पता है कि यह जावा से अलग है।) यही कारण है कि आपको TestVehicles घोषणा पर त्रुटि मिल रही है।

अनिवार्य रूप से, आपको इंटरफ़ेस लागू करने वाले प्रकार को परिभाषित करना होगा, फिर उस प्रकार के साथ काम करें।

Interfaces पर एडा राशनले अध्याय कुछ विस्तार से चर्चा करता है।

यहां आपके प्रश्न के आधार पर एक कामकाजी उदाहरण है - मैंने कुछ चीजों का नाम बदल दिया है और कुछ त्रुटियों को ठीक किया है जो शायद आप देख रहे त्रुटि संदेशों में खो गए थे :-) एक प्रकार 'Concrete_Vehicles' को जोड़ने के लिए नोट करें जो तत्काल वाहन इंटरफेस।

with Ada.Text_IO; use Ada.Text_IO; 

procedure Interface_Test is 

    package Package_Vehicle is 
     type Vehicle is interface; 

     function Start(Self : Vehicle) return String is abstract; 
    end Package_Vehicle; 


    type Concrete_Vehicles is abstract new Package_Vehicle.Vehicle with null record; 


    type Tractor is new Concrete_Vehicles with null record; 

    overriding -- optional 
    function Start(Self : Tractor) return string is 
    begin 
     return "Tractor starting!"; 
    end Start; 

    type Car is new Concrete_Vehicles with null record; 
    overriding -- optional 
    function Start(Self : Car) return string is 
    begin 
     return "Car starting!"; 
    end Start; 


    procedure TestVehicle(Vehicle : Concrete_Vehicles'Class) is 
    begin 
     Ada.Text_IO.Put_Line("Testing a vehicle"); 
     Ada.Text_IO.Put_Line(Start(Vehicle)); 
    end; 

    Tractor0 : Tractor; 
    Car0 : Car; 

begin 

    TestVehicle(Tractor0); 
    TestVehicle(Car0); 

end Interface_Test; 

संकलन और चल रहा है:

[22] Marc say: gnatmake interface_test.adb 
gcc -c interface_test.adb 
gnatbind -x interface_test.ali 
gnatlink interface_test.ali 
[23] Marc say: ./interface_test 
Testing a vehicle 
Tractor starting! 
Testing a vehicle 
Car starting! 
4

जावा शैली इंटरफेस Ada2005 में पेश किया गया था के बाद तुरंत दिखाई देनी चाहिए :

type Vehicle is interface; 

इंटरफेस पर कोई आपरेशन सार होना चाहिए:

function start(Self : Vehicle) return String is abstract; 

इंटरफ़ेस को विरासत में लेते समय, आपको इसे माता-पिता के रूप में निर्दिष्ट करना होगा, और इंटरफ़ेस के लिए परिभाषित संचालन को लागू करना होगा ("ओवरराइडिंग" संकलक को बताता है कि अभिभावक के पास "प्रारंभ" होना चाहिए। कीवर्ड वैकल्पिक है, हालांकि):

type Tractor is new Vehicle with null record; 

overriding -- optional 
function start(Self : Tractor) return String; 

मैं एक व्यायाम के रूप बाकी छोड़ देंगे, आप सभी उपयोगकर्ता के परिभाषित किया गया है "अवगत होना wikibook

+0

यह वही है जो मैंने कोशिश की है, लेकिन मुझे नहीं पता कि इसे कैसे काम करना है: – Jossi

+0

आप टेस्टवहिकल प्रक्रिया को सभी प्रकार के वाहनों में लेना चाहते हैं, न केवल पैकेज Vehicle.Vehicle, इसलिए 'वर्ग: प्रक्रिया testVehicle (वाहन: पैकेजवहन) जोड़ें। Vehicle'class) – egilhh

+0

आपको कॉल करने वाले प्रारंभिक कार्य के लिए दृश्यता की भी आवश्यकता है: 'Ada.Text_IO.Put_Line (packageVehicle.Start (वाहन));' या बिंदीदार नोटेशन (Ada2005) का उपयोग करें: 'Ada। Text_IO.Put_Line (Vehicle.Start); ' इसके अलावा, TestVehicle एक स्ट्रिंग नहीं लौटाता है, इसलिए आपको मुख्य निकाय में put_lines की आवश्यकता नहीं होगी। – egilhh

0

नीचे अपने कार्यक्रम का एक काम कर संस्करण है संकेत का उपयोग कर ("पहुँच" एडीए में कहा जाता है)। इंटरफ़ेस के साथ काम करने के लिए आपको इंटरफ़ेस के कार्यान्वयन की आवश्यकता नहीं है, जैसा कि आपके जावा उदाहरण में है, जो ऑब्जेक्ट ओरिएंटेड प्रोग्रामिंग और पॉलीमोर्फिज्म का मुख्य बिंदु है।

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 : Access packageVehicle.Vehicle'class) is 
begin 
    Ada.Text_IO.Put_Line("Testing a vehicle"); 
    Ada.Text_IO.Put_Line(Vehicle.Start); 
end; 

Tractor0 : access Tractor'Class := new Tractor; 
Car0 : access Car'Class := new Car; 

begin 

TestVehicle(Tractor0); 
TestVehicle(Car0); 

end Main; 

पुनश्च: मैं एडीए के लिए नया हूँ, मैं चीजों के साथ गलत हो सकता है, लेकिन मैं https://github.com/raph-amiard/ada-synth-lib से विचार जहां इस अवधारणा को एक बहुत प्रयोग किया जाता है है।

संबंधित मुद्दे