ورود

View Full Version : مبتدی: فرق Uses در Interface با Uses در Implementation



یوسف زالی
شنبه 25 تیر 1390, 22:26 عصر
سلام دوستان.
یکی ازم پرسید منم بلد نبودم!
:لبخند:
آیا Use کردن یک یونیت در قسمت Interface با Implementation تفاوت داره؟
آیا باعث سربار حافظه بیشتری میشه؟
و کلا فرق این دو چیه؟
ممنون.

BORHAN TEC
یک شنبه 26 تیر 1390, 00:24 صبح
فرق چندانی ندارند ولی معمولاً رسم بر اینه که یونیتهای که قبلاً توسط خودمان ساخته شده است را در قسمت Implementation وارد می کنیم. البته اگر از نظر فنی بخواهیم به این مسئله نگاه کنیم می توان گفت که:"از آنجایی که نحوه اجرای کدهای زبان دلفی مانند بسیاری از زبانهای دیگر به صورت بالا به پایین است، باید پیش نیاز های یک کد خاص در قبل از آن مهیا شوند". این مورد را با مثال توضیح می دهیم:
دو کد زیر را در نظر بگیرید:
کد 1:

unit Unit1;

interface

uses
Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
Dialogs;

type
TForm1 = class(TForm)
private
{ Private declarations }
public
{ Public declarations }
end;

var
Form1: TForm1;

implementation


{$R *.dfm}

end.

کد 2:

unit Unit1;

interface

uses
Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls,
Dialogs;

type
TForm1 = class(TForm)
private
{ Private declarations }
public
{ Public declarations }
end;

var
Form1: TForm1;

implementation

uses
Forms;
{$R *.dfm}

end.
کد 1 بدون مشکل اجرا می شود، ولی کد 2 مشکل دارد و اجرا نمی شود. این مشکل از آنجا ناشی میشود که کلاس TForm1 از کلاس TForm مشتق می شود و تعریف کلاس TForm هم در یونیت Forms قرار دارد ولی در کد 2 یونیت Forms بعد از تعریف کلاس TForm1 به یونیت جاری اضافه شده است و یونیت Forms برای کلاس TForm1 ناشناخته باقی می ماند و به همین دلیل کامپایل با خطا متوقف می شود.

یوسف زالی
یک شنبه 26 تیر 1390, 00:46 صبح
ممنون از شما.
اما منظور من کمی دقیق تره.
این رو می دونم.
بیشتر تاکید سوال بنده رو اینه که اگر میشه یونیتی رو در Implementation ذکر کنیم و ما این کارو در Interface انچام بدیم،
آیا برنامه دچار بار حافظه زمان اجرای بیشتری میشه؟
اگر نه ، پس چرا دو قسمت جدا درست کردند؟

Arman_1367
سه شنبه 28 تیر 1390, 12:29 عصر
نه نظر حافظه و سرعت اجرا تفاوتی وجود نداره تنها مسئله ای که مطرح می شود این است که یک ابزار برای برنامه نویس محسوب می گردد فرض کنید کد زیر را داشته باشیم :
Unit Unit1;

interface

///
///****
///

Type
TClass1 = Class
Private
Obj:TObject;
Public
Procedure Print;virtual;
End;


implementation

Uses
Unit2;

Procedure TClass1.Print;
Begin
if obj is TClass2 then
TClass2(Obj).Print
else
Writeln('Class1');
End;


Unit Unit2;

Interface
Uses
Unit1;
Type
TClass2=Class
Private
obj:TClass1;
Public
Procedure Print;virtual;
End;

Implementation

Procedure TClass2.Print;
Begin
Writeln('hello from tclass2');
End;


در کد بالا اگر در قسمت Interface از یونیت 1 بخواهیم از unit2 استفاده نماییم باعث می شود که کمپایلر نداند کدامیک را اول کمپایل کند و عملاً یک خطا است از این نظر در قسمت implementation نیز شما می توانید از کلمه uses استفاده نمایید که عملاً تقدم یونیتهایی که قرار است کمپایل شوند را مشخص می کند اول آنها که در قسمت interface هستند و بعد آنها که در قسمت implementation هستند.

A.Nemati
سه شنبه 28 تیر 1390, 20:32 عصر
يه سري به اينجا بزن
http://barnamenevis.org/showthread.php?21562-%D8%AA%D9%81%D8%A7%D9%88%D8%AA-%D9%85%DB%8C%D8%A7%D9%86-Uses-%D9%87%D8%A7/page2&highlight=%D8%AA%D9%81%D8%A7%D9%88%D8%AA+uses

یوسف زالی
سه شنبه 28 تیر 1390, 20:39 عصر
ممنونم از شما.
به جز تعیین اولویت که در حقیقت همون مهیا کردن پیش نیاز هاست فکر کنم جلوگیری از Circular Use هدف این کار باشه.

A.Nemati
سه شنبه 28 تیر 1390, 20:50 عصر
دقيقا همينطوره