2015-01-30 10 views
7

मैं निक होजेस की पुस्तक "डेल्फी में कोडिंग" पढ़ रहा हूं और मैं इंटरफ़ेस उपयोग को समझने की कोशिश कर रहा हूं। एक इकाई में मैं asimple इंटरफ़ेस डाल दिया है:डेल्फी इंटरफेस को समझने का प्रयास करें

unit INameInterface; 

interface 

type 
    IName = interface 
    ['{CE5E1B61-6F44-472B-AE9E-54FF1CAE0D70}'] 
    function FirstName: string; 
    function LastName: string; 
    end; 

implementation 

end. 

और मैं इस इंटरफ़ेस के कार्यान्वयन डाल दिया है एक और इकाई में, पुस्तक नमूने के साथ अनुसार:

unit INameImplementation; 

interface 

uses 
    INameInterface; 

type 
    TPerson = class(TInterfacedObject, IName) 
    protected 
     function FirstName: string; 
     function LastName: string; 
    end; 

implementation 

{ TPerson } 

function TPerson.FirstName: string; 
begin 
    Result := 'Fred'; 
end; 

function TPerson.LastName: string; 
begin 
    Result := 'Flinstone'; 
end; 

end. 

इस बिंदु पर मैं मैंने जो ऑब्जेक्ट बनाया है उसका उपयोग करने के लिए एक सरल वीसीएल फॉर्म एप्लिकेशन बनाया है। फॉर्म कोड यह है:

unit main; 

interface 

uses 
    Winapi.Windows, Winapi.Messages, System.SysUtils, System.Variants, 
    System.Classes, Vcl.Graphics, Vcl.Controls, Vcl.Forms, Vcl.Dialogs, 
    Vcl.StdCtrls, INameImplementation; 

type 
    TfrmMain = class(TForm) 
    lblFirtName: TLabel; 
    lblLastName: TLabel; 
    txtFirstName: TStaticText; 
    txtLastName: TStaticText; 
    btnGetName: TButton; 
    procedure btnGetNameClick(Sender: TObject); 
    procedure FormCreate(Sender: TObject); 
    private 
    Person: TPerson; 
    public 
    { Public declarations } 
    end; 

var 
    frmMain: TfrmMain; 

implementation 

{$R *.dfm} 

procedure TfrmMain.FormCreate(Sender: TObject); 
begin 
    txtFirstName.Caption := ''; 
    txtLastName.Caption := ''; 
end; 

procedure TfrmMain.btnGetNameClick(Sender: TObject); 
begin 
    txtFirstName.Caption := ... 
end; 

end. 

मेरा प्रश्न यह है: मैं इंटरफ़ेस का उपयोग कैसे कर सकता हूं? दो funcions संरक्षित के रूप में घोषित कर रहे हैं तो मैं उन्हें फार्म से कैसे उपयोग कर सकते हैं? मुझे उन्हें सार्वजनिक रूप से परिभाषित करना है, या मुझे INameInterface इंटरफ़ेस इकाई का उपयोग करना चाहिए? मैं इंटरफेस के बारे में बहुत उलझन में हूँ !!!

एरोस

+1

इंटरफेस का उपयोग कैसे किया जाता है इसका एक बड़ा उदाहरण ... मान लीजिए कि आपके अंदर एक ऑब्जेक्ट के साथ एक डीएलएल है जिसे आप कॉलिंग प्रक्रिया के भीतर से भी उपयोग करना चाहते हैं। आप डीएलएल सीमाओं में ऑब्जेक्ट्स को पास नहीं कर सकते हैं, लेकिन आप इंटरफेस पास कर सकते हैं (जब तक इसके सदस्य भी सुरक्षित हैं, जैसे स्ट्रिंग के बजाए वाइडस्ट्रिंग)। फिर, आप डीएलएल के अंदर ऑब्जेक्ट को तुरंत चालू करते हैं, और उस ऑब्जेक्ट का इंटरफ़ेस संदर्भ डीएलएल से कॉलिंग ऐप पर वापस भेजते हैं - फिर कॉलिंग ऐप उसी इंटरफ़ेस से उसी तरह से इंटरैक्ट कर सकता है जैसे कि आप ऑब्जेक्ट को सीधे कॉल कर रहे हैं। –

+0

@ जेरी बाइनरी इंटरऑप के साथ एक कार्यान्वयन मुद्दा है। मुझे लगता है कि इंटरफेस एक गहरी अवधारणा है। –

उत्तर

8

अनिवार्य रूप से वहाँ तीन चीजें आप को पता है के लिए, क्या आप पहले से ही समझ का प्रदर्शन किया है से परे हैं।

var 
    Name: IName; 
.... 
Writeln(Name.FirstName); 
Writeln(Name.LastName); 

:

1. एक अंतरफलक

के तरीकों कॉल करने के लिए एक अंतरफलक के लिए एक संदर्भ है, तो आप तरीकों बस के रूप में आप एक वर्ग संदर्भ पर होगा कॉल कर सकते हैं 2. इंटरफ़ेस संदर्भ कैसे प्राप्त करें

आमतौर पर आप उस कक्षा को तुरंत चालू करते हैं जो आप जिस इंटरफ़ेस का उपयोग करना चाहते हैं उसे लागू करता है:

var 
    Name: IName; 
.... 
Name := TPerson.Create; 
// now you can use Name as before 

इंटरफ़ेस संदर्भ प्राप्त करने के अन्य तरीके हैं, लेकिन अब उन्हें एक तरफ छोड़ दें।

3. आसपास पारित करने के लिए कैसे

आप एक नया वस्तु हर बार जब आप एक इंटरफेस का उपयोग करने की जरूरत है बनाना चाहते हैं नहीं हो सकता है इंटरफेस। तो आप अन्य पार्टियों को उपयोग करने के लिए इंटरफ़ेस पास करने के लिए प्राप्त कर सकते हैं। उदाहरण के इंटरफेस विधि मानकों के रूप में पारित किया जा सकता है:

procedure Foo(Name: IName); 
begin 
    // use Name as before 
end; 

आप कार्यप्रणाली कॉल और गुण के माध्यम से इंटरफ़ेस संदर्भ प्राप्त कर सकते हैं, आदि


दो कार्य protected के रूप में घोषित कर रहे हैं तो मैं कैसे कर सकते हैं उन्हें फॉर्म से एक्सेस करें?

ठीक है, उन्हें लागू करने वाले ऑब्जेक्ट में protected घोषित किया गया है। लेकिन आप उन्हें लागू करने वाले ऑब्जेक्ट के माध्यम से एक्सेस नहीं कर पाएंगे। आप उन्हें इंटरफ़ेस के माध्यम से एक्सेस करेंगे। जिसका अर्थ है कि कार्यान्वयन ऑब्जेक्ट में दृश्यता इंटरफ़ेस के परिप्रेक्ष्य से प्रासंगिक नहीं है।

आपकी फॉर्म इकाई संदर्भ INameImplementation है जो इंटरफ़ेस लागू करने वाली ऑब्जेक्ट बनाने के लिए आवश्यक है। आपको INameInterface का उपयोग करने की भी आवश्यकता होगी ताकि आपका कोड इंटरफ़ेस स्वयं देख सके।

यह उदाहरण अभी तक बहुत शक्तिशाली नहीं है क्योंकि आप अभी भी कार्यान्वयन ऑब्जेक्ट के प्रकार को देख सकते हैं। लेकिन कल्पना करें कि क्या यह आपके से छिपा हुआ था और आप जो भी देख सकते थे वह एक ऐसा फ़ंक्शन था जो IName लौटा था। यह तब होता है जब आप इस बिंदु तक पहुंचते हैं कि इंटरफेस उनकी क्षमता प्राप्त कर सकते हैं।

+0

बहुत ज्यादा डेविड। बस एक और सवाल: इसलिए मुझे मुख्य इकाई के उपयोग खंड में INameInterface और INameIplementation शामिल करना होगा। क्या यह इस तरह की वस्तुओं का सामान्य उपयोग है? – Eros

+0

इस से इंटरफ़ेस पर कहने के लिए बहुत कुछ है लेकिन मैंने मूल बातें करने की कोशिश की। मुझे विश्वास है कि निक की किताब बहुत कुछ कहती है। –

+0

@Eros: सभी इंटरफ़ेस उपभोक्ताओं को केवल इंटरफ़ेस इकाई का संदर्भ देना चाहिए। निर्भरता इंजेक्शन कोडिंग की इस शैली के लिए एक प्राकृतिक फिट है। – whosrdaddy

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