<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0"
	xmlns:content="http://purl.org/rss/1.0/modules/content/"
	xmlns:wfw="http://wellformedweb.org/CommentAPI/"
	xmlns:dc="http://purl.org/dc/elements/1.1/"
	xmlns:atom="http://www.w3.org/2005/Atom"
	xmlns:sy="http://purl.org/rss/1.0/modules/syndication/"
	xmlns:slash="http://purl.org/rss/1.0/modules/slash/"
	>

<channel>
	<title>VCL Developer &#187; Farsi</title>
	<atom:link href="http://vcldeveloper.com/tag/farsi/feed/" rel="self" type="application/rss+xml" />
	<link>http://vcldeveloper.com</link>
	<description>Ali Keshavarz&#039;s Website</description>
	<lastBuildDate>Fri, 04 Nov 2011 23:40:16 +0000</lastBuildDate>
	<language>fa</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
	<generator>http://wordpress.org/?v=</generator>
		<item>
		<title>دانلود از مارکت آمازون برای اندروید</title>
		<link>http://vcldeveloper.com/tips-tricks/download-from-amazon-appstore-for-android/</link>
		<comments>http://vcldeveloper.com/tips-tricks/download-from-amazon-appstore-for-android/#comments</comments>
		<pubDate>Wed, 13 Apr 2011 15:21:06 +0000</pubDate>
		<dc:creator>Ali Keshavarz</dc:creator>
				<category><![CDATA[Tips & Tricks]]></category>
		<category><![CDATA[Amazon]]></category>
		<category><![CDATA[Android]]></category>
		<category><![CDATA[Farsi]]></category>
		<category><![CDATA[Mobile]]></category>
		<category><![CDATA[فارسی]]></category>

		<guid isPermaLink="false">http://vcldeveloper.com/?p=408</guid>
		<description><![CDATA[در این نوشته قصد دارم درباره چگونگی دانلود از مارکت آمازون برای اندروید بنویسم… حدود یک ماهی میشه که شرکت آمازون یک فروشگاه آنلاین برای نرم افزارهای سیستم عامل اندروید افتتاح کرده. هر چند این فروشگاه به اندازه فروشگاه اندروید مارکت گوگل نرم افزار نداره، و به اندازه اون هم همه گیر نیست، اما با [...]]]></description>
			<content:encoded><![CDATA[<div dir="rtl">
<p style="text-align: justify;" dir="rtl">در این نوشته قصد دارم درباره چگونگی دانلود از مارکت آمازون برای اندروید بنویسم…</p>
<p style="text-align: justify;" dir="rtl">حدود یک ماهی میشه که شرکت آمازون یک فروشگاه آنلاین برای نرم افزارهای سیستم عامل اندروید افتتاح کرده. هر چند این فروشگاه به اندازه فروشگاه اندروید مارکت گوگل نرم افزار نداره، و به اندازه اون هم همه گیر نیست، اما با توجه به عظمت شرکت آمازون، و تخصص آن در فروشگاه های آنلاین، و محتوای متنوعی که این شرکت ارائه میکنه، و توجه روز افزون این شرکت به تبلت ها؛ میشه امیدوار بود که این فروشگاه به زودی به عنوان رقیبی برای اندروید مارکت شرکت گوگل تبدیل بشه، و مانعی بر سر راه انحصار طلبی تدریجی گوگل در بازار اندروید بشه. در حال حاضر، آمازون هر روز یک نرم افزار تجاری را به طور رایگان در اختیار کاربرانش قرار میده، که همین خودش تبلیغ خوبی برای این سرویس هست.</p>
<p style="text-align: justify;" dir="rtl">مارکت آمازون از دو طریق وب سای و همچنین از طریق نرم افزار اختصاصی این شرکت در دسترس هست. کاربر میتونه از طریق وب سایت آمازون یا نرم افزار مارکت آمازون لیست نرم افزارها را مرور کنه، و نرم افزار دلخواه اش را خریداری کنه. در این حالت، نرم افزار مربوطه به لیست آنلاین نرم افزارهای کاربر در سایت آمازون افزوده میشه، و کاربر میتونه از طریق نرم افزار مارکت آمازون بر روی دستگاه اندروید خود، نرم افزار های خود را دانلود کرده و بر روی دستگاه نصب کنه. مارکت فعلی امکان جستجو در لیست نرم افزارها، مشاهده دسته بندی نرم افزار، مشاهده صد نرم افزار رایگان و تجاری برتر، ایجاد Wish List، و ارائه لیست نرم افزارهای پیشنهادی بر اساس علایق شما را فراهم میکنه. البته متاسفانه نرم افزار مارکت آمازون که بر روی دستگاه نصب میشه، امکان شناسایی نرم افزارهای نصب شده فعلی را نداره، و اگر بخواید نسخه جدیدی از یکی از نرم افزارهای فعلی تان را نصب کنید، آمازون قبل از نصب نسخه جدید، نسخه قبلی را حذف میکنه، اما بعد از اینکه یک بار نرم افزار مربوطه با مارکت آمازون نصب شد، دفعات بعد، می تونید بدون مشکل آن نرم افزار را توسط مارکت آمازون آپدیت کنید.</p>
<p style="text-align: justify;" dir="rtl"><span id="more-408"></span></p>
<p style="text-align: justify;" dir="rtl">
<h2 style="text-align: justify;" dir="rtl">محدودیت فعلی دانلود</h2>
<p style="text-align: justify;" dir="rtl">بزرگترین مشکل فعلی مارکت آمازون برای اندروید، محدود کردن کاربران آن به کاربران آمریکایی هست؛ یعنی فعلا به طور رسمی، مارکت آمازون فقط به کاربرانی که در آمریکا زندگی می کنند، سرویس ارائه میکنه، و کاربرانی که قصد دانلود از سایر نقاط جهان را داشته باشند، قادر نخواهند بود که از این مارکت دانلود کنند. در این حالت، برای ما کاربران ایرانی اندروید، فرق خاصی بین مارکت گوگل و آمازون وجود نخواهد داشت؛ در هر دو حالت، امکان دانلود نرم افزار برای ما فراهم نیست.</p>
<p style="text-align: justify;" dir="rtl">اما برخلاف گوگل، شرکت آمازون کنترل خاصی بر روی دستگاه های اندروید فروخته شده نداره، و به اندازه گوگل هم محدودیت برای کاربران ایجاد نمیکنه. در واقع دانلود نرم افزار مارکت آمازون برای اندروید توسط هر کاربری حتی ایرانی امکان پذیر هست، و ثبت نام در سایت آمازون هم آزاد هست؛ اما در هنگام دانلود، آمازون از شما میخواد که اطلاعات مربوط به بخش ۱-Click Purchase را در خصوصیات کاربری خودتان وارد کنید. این اطلاعات شامل آدرس شما، و اطلاعات کارت اعتباری شما میشه، و اگر اطلاعات معتبری برای کارت اعتباری وارد نکنید، یا آدرس شما خارج از ایالات متحده آمریکا باشه، امکان دانلود برای شما فراهم نخواهد شد.</p>
<p style="text-align: justify;" dir="rtl">
<h2 style="text-align: justify;" dir="rtl">چگونگی دور زدن محدودیت دانلود</h2>
<p style="text-align: justify;" dir="rtl">همانطور که گفتم، آمازون به اطلاعات معتبر یک کارت اعتباری، و یک آدرس معتبر در داخل آمریکا نیاز داره، تا به شما اجازه دانلود بده. خب اگر یک کارت اعتباری معتبر آمریکایی داشته باشید، مشکلی نیست؛ می تونید هم نرم افزارهای رایگان و هم نرم افزارهای تجاری را از مارکت آمازون دانلود کنید. اما اگر کارت اعتباری آمریکایی نداشته باشید، چطور؟</p>
<p style="text-align: justify;" dir="rtl">در واقع شرکت آمازون فقط اعتبار کارت اعتباری را با بررسی الگوی اعداد به کار رفته در شماره کارت اعتباری بررسی میکنه، و اگر شما الگویی از اعداد را به عنوان شماره کارت اعتباری وارد کنید که مشابه یکی از الگوهای استفاده شده توسط شرکت های معتبر کارت اعتباری باشه، آمازون شماره کارت اعتباری شما را قبول میکنه. البته این به معنی آن نیست که با همچین شماره کارت اعتباری می تونید از آمازون خرید کنید، بلکه در زمان خرید یک محصول تجاری، صحت اطلاعات کارت اعتباری شما بررسی میشه، و در اون صورت، شماره جعلی شما جواب نخواهد داد، اما این بررسی فقط برای دانلود نرم افزارهای تجاری صورت میگیره، پس اگر بخواید نرم افزارهای رایگان را دانلود کنید، با همین شماره کارت جعلی هم می تونید این کار را انجام بدید. البته دقت داشته باشید که اگر آمازون متوجه استفاده از شماره کارت جعلی بشه، حساب آمازون شما مسدود خواهد شد!</p>
<p style="text-align: justify;" dir="rtl">نرم افزارها و سایت هایی هستند که می تونند برای شما شماره های کارت اعتباری به ظاهر صحیح تولید کنند، یکی از این سایت ها، سایت fakenamegenerator.com هست، که میتونه برای شما نام، آدرس، شماره تلفن، و شماره کارت اعتباری به ظاهر معتبر، ولی در واقع جعلی تولید کنه. دقت داشته باشید که سئولیت استفاده از اینگونه ابزارها با خودتان خواهد بود.</p>
<p style="text-align: justify;" dir="rtl">بعد از به دست آوردن یک شماره کارت اعتباری و  آدرس، می تونید با این نام و آدرس در سایت آمازون ثبت نام کنید. بعد از ثبت نام در سایت آمازون، به صفحه مربوط به Appstore for Android برید، و در گوشه بالا سمت راست، در کادر Get Sarted، آدرس ایمیل خود را وارد کنید. و بر روی دکمه Go کلیک کنید. با این کار، لینک دانلود Appstore برای شما ایمیل میشه، و می تونید از طریق اون لینک، فایل apk مربوطه را دریافت، و در دستگاه خودتان نصب کنید.</p>
<p style="text-align: justify;" dir="rtl">بعد از نصب برنامه در دستگاه اندریود خود، به سایت آمازون برگردید؛ و به صفحه Your Account برید، و در بخش Settings، گزینه ۱-Click Settings را انتخاب کنید. در این صفحه، از شما اطلاعات کارت اعتباری، آدرس، و تلفن شما درخواست میشه. اطلاعات کارت اعتباری که از طریق سایت fakenamegenerator به دست آوردید را در فیلدهای مربوطه وارد کنید. آدرس خود، شامل کشور، ایالت، شهر، و نام خیابان، را در فیلدهای مربوطه وارد کنید. اگر پس از ثبت آدرس، آمازون از آدرس وارد شده برای خیابان ایراد گرفت، می تونید یک آدرس واقعی در همان شهر را به راحتی با جستجو برای نام آن شهر پیدا کنید، مثلا سایت های مشاور املاک متعددی وجود دارند که آدرس خانه ها و ویلاهای آماده فروش یا کرایه را درج می کنند، یا شرکت های مختلف حاضر در شهر، آدرس خود را در سایت شان درج می کنند. پس می توانید به راحتی یک آدرس معتبر در داخل شهر و ایالت مورد نظر پیدا کنید. اگر آمازون به شما پیشنهاد داد که شاید ZIP Code وارد شده، اشتباه باشه، و منظور شما فلان آدرس هست، همان آدرس پیشنهادی آمازون را  قبول کنید. شماره تلفن جعلی که در مرحله قبل به دست آوردید را هم در کادر مربوط به شماره تلفن وارد کنید، فقط دقت کنید که حتما در ابتدای شماره تلفن، عبارت ۱+ که کد تلفن کشور آمریکا هست، را قید کنید، وگرنه امکان دانلود برای شما فراهم نخواهد شد!</p>
<p style="text-align: justify;" dir="rtl">با ذخیره کردن تنظیمات بالا، می توانید در دستگاه اندروید خود برنامه Appstore را اجرا کرده، و در سایت آمازون لاگین کنید، و لیست نرم افزارها را مرور کنید. هر نرم افزاری <strong>رایگانی </strong>که مایل به دانلود آن هستید را انتخاب کرده، و گزینه Get app را کلیک کنید. با این کار، فرایند دریافت آن فایل شروع خواهد شد. ابتدا آمازون یک فاکتور خرید برای شما ایمیل می کند، و سپس دانلود نرم افزار بر روی دستگاه شروع خواهد شد. بعد از اتمام دانلود، نرم افزار بر روی دستگاه شما نصب می شود.</p>
<p style="text-align: justify;" dir="rtl">
<h3 style="text-align: justify;" dir="rtl">دانلود با استفاده از کارت اعتباری معتبر غیر آمریکایی</h3>
<p style="text-align: justify;" dir="rtl">اگر یک کارت اعتباری معتبر، ولی غیر آمریکایی دارید، و قصد خرید محصولات تجاری از مارکت آمازون برای اندروید را دارید، در این مرحله می توانید اطلاعات کارت اعتباری واقعی خودتان را در تنظیمات حساب کاربری خودتان وارد کنید، و از طریق آن به خرید بپردازید؛ چون ظاهرا بررسی آمریکایی بودن آدرس شما فقط یک بار انجام میشه، و تغییر آدرس و شماره کارت اعتباری در مراحل بعدی، تاثیری بر امکان دانلود یا خرید شما نخواهد داشت.</p>
<p style="text-align: justify;" dir="rtl">
<p style="text-align: justify;" dir="rtl">خوش بگذره <img class="wlEmoticon wlEmoticon-smile" style="border-style: none;" src="http://vcldeveloper.com/wp-content/uploads/2011/04/wlEmoticon-smile.png" alt="Smile" /></p>
</div>
]]></content:encoded>
			<wfw:commentRss>http://vcldeveloper.com/tips-tricks/download-from-amazon-appstore-for-android/feed/</wfw:commentRss>
		<slash:comments>1</slash:comments>
		</item>
		<item>
		<title>اینترفیس ها در دلفی</title>
		<link>http://vcldeveloper.com/articles/interfaces_in_delphi/</link>
		<comments>http://vcldeveloper.com/articles/interfaces_in_delphi/#comments</comments>
		<pubDate>Tue, 17 Mar 2009 22:04:45 +0000</pubDate>
		<dc:creator>Ali Keshavarz</dc:creator>
				<category><![CDATA[Articles]]></category>
		<category><![CDATA[Article]]></category>
		<category><![CDATA[Delphi]]></category>
		<category><![CDATA[Farsi]]></category>
		<category><![CDATA[Interfaces]]></category>
		<category><![CDATA[اینترفیس]]></category>
		<category><![CDATA[دلفی]]></category>
		<category><![CDATA[رابط]]></category>
		<category><![CDATA[فارسی]]></category>
		<category><![CDATA[مقاله]]></category>

		<guid isPermaLink="false">http://vcldeveloper.com/?p=64</guid>
		<description><![CDATA[در این مقاله تعریف مختصری از مفهوم Interface و Abstract Class در طراحی نرم افزار ارائه می کنیم، و سپس به قابلیت های نوع Interface در دلفی و برخی کاربردهای آن، با ذکر مثال، می پردازیم.]]></description>
			<content:encoded><![CDATA[<div dir="rtl">
<p>در این مقاله تعریف مختصری از مفهوم Interface و Abstract Class در طراحی نرم افزار ارائه می کنیم، و سپس به قابلیت های نوع Interface در دلفی و برخی کاربردهای آن، با ذکر مثال، می پردازیم.</p>
<h2>مقدمه</h2>
<p>نوع Interface از نسخه ۳ به دلفی اضافه شد تا پشتیبانی از تکنولوژی COM شرکت مایکروسافت در دلفی فراهم شود. Interface علاوه بر پشتیبانی از COM، قابلیت های جالبی برای برنامه نویسان دلفی به ارمغان آورد که کمتر از آن استفاده می شود. متاسفانه به دلیل آنکه چارچوب اصلی VCL و بخصوص کامپوننت های کار با بانک اطلاعاتی دلفی مدت ها قبل از آن (از نسخه اول دلفی) ایجاد شده بودند، استفاده چندانی از Interfaceها در  VCL صورت نگرفت.</p>
<p>برای درک بهتر interface ها، و قبل از آنکه به تعریف Interface و کاربردهای آن بپردازیم، ابتدا به مفهوم کلاس های Abstract و تعریف آنها اشاره ایی خواهیم داشت؛ زیرا مشابهت هایی در کاربرد این دو مفهوم وجود دارد، و شناخت مفهوم کلاس های Abstract درک مفهوم Interfaceها را ساده تر می کند.</p>
</div>
<p><span id="more-64"></span></p>
<div dir="rtl">
<h2>کلاس های Abstract</h2>
<p>در دلفی، کلاسی که حداقل یکی از متدهای آن با استفاده از رهنمود abstract تعریف شده باشد، کلاس Abstract نامیده می شود.<br />
متدهای abstract متدهایی هستند که توسط یک کلاس والد (parent) تعریف می شوند، اما پیاده سازی نمی شوند. پیاده سازی اینگونه متدها بر عهده کلاس های فرزند (child) می باشد.<br />
در صورتی که یک نمونه (instance) [ یک شی (object) ]  از یک کلاس abstract ایجاد کنید، با هشدار کامپایل مواجه خواهید شد و در صورتی که یکی از متدهای abstract آن شی را فراخوانی کنید، برنامه شما با یک استثنای EAbstractError&#8221;" متوقف خواهد شد.</p>
<p>در اینجا این سوال ممکن است مطرح شود که اصلا کلاس یا متدی که هیچ پیاده سازیی ندارد و نمی توان از آن یک نمونه شی ایجاد کرد، چه استفاده ایی ممکن است داشته باشد؟<br />
کلاس های Abstract در ساختار یک نرم افزار موجب می شوند که برنامه نویسی که پیاده سازی کلاس های فرزند را برعهده دارد، ملزم به پیاده سازی یکسری رفتارهای معین در هر یک از کلاس های خود شود؛ در غیر این صورت، با هشدارهای کامپایلر مواجه می شود. به این ترتیب احتمال اشتباه برنامه نویس (بخصوص در پروژه های بزرگ) کاهش می یابد.<br />
<span style="text-decoration: underline;">مثال :</span><br />
فرض کنید قصد داریم دو نوع پنجره طراحی کنیم (پنجره بیضوی و پنجره مستطیلی). هر دو این پنجره رفتارهای استانداردی مثل Minimize, Restore و غیره دارند. هر دو این پنجره ها باید ترسیم شوند، اما نحوه ترسیم هر یک از آنها فرق می کند. برای طراحی آنها می توانیم رفتارهای مشترک آنها را در کلاس TBaseWindow قرار دهیم و کلاس های دیگر از همین کلاس پایه، مشتق شوند. برای تعریف کلاس TBaseWindow دو روش می توانیم بکار بریم.</p>
<p>روش اول:</p>
<div dir="ltr">
<pre class="brush: delphi; title: ; notranslate">
TBaseWindow = class
private
  AField  : TSomeType;
public
  procedure Draw; virtual;
  procedure Minimize;
  procedure Maximize;
  procedure Restore;
end;
</pre>
</div>
<p>متد Draw در کلاس پایه به صورت virtual تعریف شده است، در نتیجه کلاس های TOvalWindow و TRectangularWindow (دو کلاس فرضی برای رسم پنجره بیضوی و مستطیلی، مشتق شده از کلاس پایه TBaseWindow) می توانند این متد را override کرده و پیاده سازی خود را اعمال کنند. اگر برنامه نویسان این کلاس ها فراموش کنند که متد Draw را Override کنند، تا زمان اجرای برنامه مشکلی بوجود نخواهد آمد؛ اما در زمان اجرا با فراخوانی متد Draw پنجره ایی رسم نخواهد شد!</p>
<p>روش دوم:</p>
<div dir="ltr">
<pre class="brush: delphi; title: ; notranslate">
TBaseWindow = class
private
  AField  : TSomeType;
public
  procedure Draw; virtual; abstract;
  procedure Minimize;
  procedure Maximize;
  procedure Restore;
end;
</pre>
</div>
<p>متد Draw در کلاس پایه بصورت abstract تعریف شده است. اگر برنامه نویسی که کلاس های TOvalWindow و TRectangularWindow را ایجاد می کند، فراموش کند که متد Draw را پیاده سازی کند؛ با فراخوانی متد Draw هشدار زیر را دریافت می کند:</p>
<div dir="ltr">
<p>OvalWindow.Draw;</p>
<p>Constructing instance of TOvalWindow contains abstract method TBaseWindow.Draw</p>
</div>
<h2>Interfaces</h2>
<p>اینترفیس ها نوعی قرارداد بین دو یا چند کلاس محسوب می شوند که در آن یک کلاس پیاده سازی تمامی متدهای مشخص شده در قرار داد را برای استفاده سایر کلاس ها یا کاربر تضمین می کند. پیاده سازی این متدها از دید کلاس های استفاده کننده و کاربر پنهان است. اینترفیس ها شبیه به کلاسی هستند که تمامی متد های آن abstract باشد و هیچ فیلدی برای ذخیره اطلاعات نداشته باشد.</p>
<p>اما اینترفیس ها ویژگی هایی دارند که آنها را از کلاس های Abstract جدا می کند:</p>
<p>۱-	اینترفیس ها  کلاس نیستند، بلکه یک نوع (Type) مستقل در زبان مربوطه (در اینجا Object Pascal) محسوب می شوند.<br />
۲-	اینترفیس ها از TObject مشتق نمی شوند. IUnknown در نسخه های قبلی دلفی (قبل از دلفی ۵) بعنوان والد تمام اینترفیس ها محسوب می شد، اما از نسخه ۵ به بعد، همه اینترفیس ها از IInterface مشتق می شوند.  IUnknown و IInterface یکسان هستند. از IUnknown در برنامه های مبتنی بر تکنولوژی COM مایکروسافت استفاده می شود.<br />
۳-	اگر پیدا سازی نکردن یک متد از کلاس abstract ،در کلاس های فرزند، موجب ایجاد هشدار کامپایلر می شد؛ پیاده سازی نکردن هر یک از متدهای یک اینترفیس، توسط کلاسی که آن اینترفیس را پشتیبانی می کند، موجب کامپایل نشدن برنامه می شود.<br />
۴-	یک کلاس می تواند از چندین اینترفیس بطور همزمان پشتیبانی کند.<br />
۵-	اینترفیس ها در دلفی قابلیت Reference-counting (شمارش مرجع) دارند.</p>
<p><span style="text-decoration: underline;">نکته</span>: از اینترفیس ها هم مثل کلاس های abstract نمی توان یک نمونه (شی) ایجاد کرد.</p>
<p>اینترفیس ها این امکان را به شما می دهند که خارج از ساختار سلسله مراتبی کلاس ها، قابلیت هایی را به برخی از کلاس های خود اضافه کنید. برای مثال فرض کنید شما کلاسی بنام TCar (برای تعریف یک اتومبیل) دارید که کلاس هایی مثل  TSUV, TTruck, TSedan, TVan و غیره (برای تعریف انواع اتومبیل) از آن مشتق شده اند. اگر شما قصد اضافه کردن قابلیت ۴WD (تقسیم نیروی محرکه بر روی هر چهار چرخ) به ماشین های SUV و Van داشته باشید، نمی توانید این قابلیت را در کلاس TCar پیاده سازی کنید، چون در این صورت تمامی ماشین ها از آن بهره خواهند برد. البته می توان این قابلیت را در هر یک ار این کلاس ها بصورت مستقل تعریف و پیاده سازی کرد، اما در صورت استفاده از اینترفیس (در اینجا I4wd)، هم می توانید از یک واسط مشترک استفاده کنید و هم از قابلیت های Polymorphic (چند ریختی) اینترفیس ها بهره ببرید:</p>
<div dir="ltr">
<pre class="brush: delphi; title: ; notranslate">
I4wd = interface
   ['{C2816773-A5DF-4136-AC86-27E6231DB4A9}']
   procedure Initialize4WD;
end;

TCar = class(TInterfacedObject)
public
   procedure SomeCommonBehavior;
   procedure StartEngine; virtual;
end;

TSedan = class(TCar)
public
  procedure SomeSpecificBehavior;
  procedure StartEngine; override;
end;

TSUV = class(TCar, I4wd)
public
   procedure SomeSpecificBehavior;
   procedure StartEngine; override;
   procedure Initialize4WD;
end;

TVan = class(TCar, I4wd)
public
  procedure SomeSpecificBehavior;
  procedure Initialize4WD;
end;

{نحوه استفاده}

procedure Drive4WD(A4WDCar : I4WD);
begin
  if Assigned(A4WDCar) then
  begin
     A4WDCar.Initialize4WD;
    {Add Code for driving the car here}
  end;
end;
</pre>
</div>
<p>با استفاده از رویه Drive4WD شما می توانید هر ماشینی را که از اینترفیس I4WD پشتیبانی می کند، برانید. البته هر ماشین متد Initialize4WD مربوط به خود را فراخوانی می کند. برای مثال:</p>
<div dir="ltr">Drive4WD(TVan.Create);</div>
<p>نگران آزاد کردن حافظه اشغال شده توسط TVan.Create نباشید، شی ایجاد شده بصورت خودکار آزاد خواهد شد.</p>
<div dir="rtl">
<h3>Globally Unique Identifier (GUID)</h3>
</div>
<p>عبارت  {C2816773-A5DF-4136-AC86-27E6231DB4A9}در تعریف اینترفیس بالا، یک GUID نامیده می شود. GUID عددی ۱۲۸ بیتی است (در مبنای ۱۶) که با تقریب بالایی منحصر به فرد می باشد [ تعداد کل GUID هایی که می توان ساخت ۲ به توان ۱۲۸ است و عملا احتمال اینکه دو GUID یکسان تولید شود بسیار کم است.]</p>
<p>استفاده از GUID در تعریف یک اینترفیس موجب منحصر به فرد شدن آن اینترفیس می شود، به عبارت دیگر، حتی اگر چند اینترفیس در یک سیستم با نام مشابه وجود داشته باشند، مشکلی در استفاده از آنها بوجود نمی آید. استفاده از GUID در یک اینترفیس  اجباری  نیست، اما وجود آن برای استفاده از عملگر as، متد GetInterface، تابع Supports و متد QueryInterface  (بطور کلی (Interface Querying الزامی است. اشیاء COM، اینترفیس ها و Type Library  آنها نیز باید هر کدام دارای GUID باشند.</p>
<p>برای ساخت GUID در Editor دلفی می توانید از ترکیب سه کلید Ctrl+Shift+G استفاده کنید تا دلفی برای شما یک GUID ایجاد کند.</p>
<p>نکته: هیچگاه GUID یک اینترفیس را در یک اینترفیس دیگر استفاده نکنید.</p>
<h3>استخراج یک Interface از داخل یک Class</h3>
<p>فرد متاهلی را در نظر بگرید که ریس یک شرکت می باشد. این فرد در رابطه با کارمندان خود نقش ریس، در رابطه با همسر خود نقش شوهر و در رابطه با فرزندان خود نقش پدر را ایفا می کند. در واقع این فرد در رابطه با هر گروه از افراد مذکور طبق یک رسم یا توافق مشترک، عمل می کند. هر یک از این گروه ها نیز بر اساس همان توافق یا رسم با این فرد ارتباط برقرار می کند و فقط به نقش مربوط به خود نیاز دارد (مثلا یک کارمند نیازی به دانستن رابطه ریس خود با همسر و فرزندانش ندارد). در دنیای نرم افزار هم یک کلاس می تواند با پیاده سازی اینترفیس های مختلف، نقش های مختلفی را در ارتباط با دنیای خارج بر عهده بگیرد.</p>
<p>حال، فرد فوق را بعنوان یک کلاس و توافق او با هر یک از گروه های فوق را به عنوان یک اینترفیس در نظر می گیریم:<br />
هر گروه (درخواست کننده؛ هر شی در دنیای خارج از آن کلاس) باید ابتدا بررسی کند که آیا فرد  (کلاس پیاده سازی کننده )  مذکور به رسومات و توافق مشخص شده (اینترفیس)  پایبند هست یا نه، اگر آن کلاس از اینترفیس مشخص شده پشتیبانی کند، درخواست کننده می تواند، بر اساس همان اینترفیس، درخواست خود را به آن کلاس ارائه دهد و جواب دریافت کند (استخراج یک اینترفیس از کلاسی که آن را پیاده سازی می کند).</p>
<p>در دلفی برای بررسی پشتیبانی کردن یک کلاس از یک اینترفیس خاص و استخراج آن اینترفیس می توان از تابع Supports در یونیت SysUtils، متد QueryInterface از هر کلاسی که IInterface را پشتیبانی می کند (مثل TInterfaceObject)  ، عملگر as، یا متد GetInterface در کلاس TObject استفاده کرد.[۱]</p>
<p>به روش های مختلف استخراج اینترفیس I4WD از کلاس TSUV در مثال زیر توجه کنید:</p>
<div dir="ltr">
<pre class="brush: delphi; title: ; notranslate">
var
SUV : TSUV;
A4wdInterface : I4WD;
begin
  {If TSuv implements I4WD (supports it), extract the interface.}
  if Supports(TSUV.Create,I4WD,A4wdInterface) then
  {Invoke Initialize4WD from returned interface.}
  A4wdInterface.Initialize4WD;

  //----------------------------------
  {Just check if TSuv supports I4WD, no interface is returned.}
  if Supports(TSuv,I4WD) then
  ShowMessage('TSuv supports I4WD interface');

  //----------------------------------
  SUV := TSUV.Create;
  {If you are sure than SUV supports I4WD, use as operator to extract
  the interface and invoke Initialize4WD.
  If SUV does not support I4WD, an exception will be thrown.}
  (SUV as I4wd).Initialize4WD;

  //----------------------------------
  SUV := TSUV.Create;
  {If Suv implements I4WD (supports it), extract the interface.}
  if SUV.GetInterface(I4WD,A4wdInterface) then
  A4wdInterface.Initialize4WD;

  //----------------------------------
  {TSUV supports I4WD, so you can assign an instance of it to a variable of type I4WD.}
  A4wdInterface := TSuv.Create;
  A4wdInterface.Initialize4WD;
end;
</pre>
</div>
<p>* تمامی توابع و عملگرهای فوق در راهنمای دلفی توضیح داده شده اند.</p>
<h3>Multiple Inheritance (وراثت چندگانه)</h3>
<p>در زبانهایی مثل دلفی، C#، و جاوا وراثت چندگانه امکان پذیر نیست &#8211; یعنی یک کلاس نمی تواند مثل C++ از چند کلاس والد مشتق شود. اما در این زبان ها امکان پیاده سازی چند اینترفیس توسط یک کلاس وجود دارد و می تواند به نوعی این خلاء را پر کند. مثلا کلاس TMyMobile (یک کلاس فرضی مربوط به گوشی موبایل) می تواند بطور همزمان اینترفیس های IInfraRed و IBlueTooth را پیاده سازی کند:</p>
<div dir="ltr">
<pre class="brush: delphi; title: ; notranslate">
TMyMobile = class(TInterfaceObject, IInfraRed, IBlueTooth)
  {TMobile's fields and methods + IInfraRed's methods + IBlueThoot's methods}
end;
</pre>
</div>
<h3>Reference counting (شمارش مرجع)</h3>
<p>یکی از ویژگی های مهم اینترفیس ها در دلفی (همچنین در COM) خصوصیت Reference Counting آنها ست. با استفاده از این قابلیت اشیاء ایجاد شده بصورت خودکار مدیریت می شوند و در صورتی که نیازی به آنها نباشد، بطور خودکار آزاد می شوند. متدهای مربوط به این قابلیت در اینترفیس IInterface تعریف شده اند.<br />
هر بار که اینترفیسی از یک کلاس استخراج می شود یا نمونه ایی از یک کلاس به متغیری از یک اینترفیس اختصاص داده می شود، دلفی متد _AddRef از اینترفیس IInterface را فراخوانی می کند. هر زمان که آن متغیر نا معتبر شود (با اختصاص مقدار nil به آن یا خارج شدن از محدوده تعریف آن متغیر)، دلفی متد _Release را فراخوانی می کند. شما به عنوان برنامه نویس وظیفه دارید که متغیری در کلاس خود تعریف کرده (برای ذخیره شماره مرجع) و این متد ها را پیاده سازی کنید. با اجرای _AddRef باید یک واحد به شماره مرجع اضافه شود. با اجرای _Release باید یک واحد از شماره مرجع کم شود، اگر شماره مرجع به صفر رسید، _Release وظیفه آزاد کردن شی ایجاد شده را بر عهده دارد.</p>
<p>در صورتی که تمایلی به پیاده سازی متدهای فوق ندارید، می توانید کلاس خود را از کلاس TInterfacedObject مشتق بگیرید. در این صورت کلاس TInterfacedObject قابلیت شمارش مرجع را برای کلاس شما پیاده سازی خواهد کرد. TInterfacedObject در یونیت System تعریف شده است. بهتر است کد آن را مطالعه نمایید.</p>
<p>به مثال های زیر در رابطه با کاربرد Reference Counting توجه کنید:</p>
<div dir="ltr">
<pre class="brush: delphi; title: ; notranslate">
procedure TForm1.Button3Click(Sender: TObject);
var
  SUV : TSUV;
  Van : TVan;
  AnInterface,
  AnotherInterface : I4WD;
begin
  Memo1.Clear;
  SUV := TSuv.Create;
  //SUV.RefCount = 0
  AnInterface := SUV;
  //SUV.RefCount = 1
  AnotherInterface := SUV;
  //SUV.RefCount = 2

  Van := TVan.Create;
  //Van.RefCount = 0;
  AnInterface := Van;
  //SUV.RefCount = 1
  //Van.RefCount = 1
end;
//&quot; AnInterface&quot; is out of scope: SUV.RefCount = 0
//SUV is destroyed
//AnotherInterface is out of scope: Van.RefCount = 0
//Van is destroyed
</pre>
</div>
<p>در مثال بالا به تغییرات RefCount توجه کنید:<br />
زمانی که SUV به یک اینترفیس اختصاص داده می شود، یک واحد به شمارشگر مرجع آن افزوده می شود.<br />
با اختصاص SUV به اینترفیس بعدی (AnotherInterface)، شمارشگر مرجع آن به ۲ می رسد.<br />
با اختصاص  Vanبه اینترفیس AnInterface ، شمارشگر مرجع این شی یک واحد افزایش پیدا می کند، ولی شمارشگر مرجع شی SUV که قبلا به AnInterface اختصاص داده شده بود، یک واحد کاهش پیدا می کند.<br />
در پایان این متد، هیچ کدی برای آزاد سازی متغیرهای SUV و Van وجود ندارد؛ اما با پایان یافتن کد Form1.Button3Click، متغیرهای AnInterface و AnotherInterface که بصورت محلی تعریف شده اند، نامعتبر می شوند و با نامعتبر شدن هر یک از آنها، یک واحد از شمارشگر مرجع هر یک از اشیاء اختصاص یافته به آنها کاهش میابد. با صفر شدن شمارشگر مرجع هر شی، آن شی آزاد می شود.</p>
<p>Malcome Groves در مقاله Interfaces: Off the Beaten Track مثالی از پیاده سازی قابلیت Garbage Collection با استفاده از اینترفیس ارائه کرده است[۲] :</p>
<div dir="ltr">
<pre class="brush: delphi; title: ; notranslate">
unit mtReaper;

interface

type
ImtReaper = interface
  ['{1B321324-975F-4026-B742-E7B3AD486BB5}']
end;

TmtReaper = class(TInterfacedObject, ImtReaper)
private
  FObject : TObject;
public
  constructor Create(AObject : TObject);
  destructor Destroy; override;
end;

implementation

uses SysUtils;

constructor TmtReaper.Create(AObject: TObject);
begin
  FObject := AObject;
end;

destructor TmtReaper.Destroy;
begin
  FreeAndNil(FObject);
  inherited;
end;

end.
</pre>
</div>
<p>در این کد کلاس ساده ایی ((TmtReaper تعریف شده که Garbage Collection را برای شما انجام می دهد. با ارسال یک شی به متد Create این کلاس، شی مورد نظر در زمان مقتضی آزاد خواهد شد و نیازی نیست که شما شخصا آن شی را آزاد کنید:</p>
<div dir="ltr">
<pre class="brush: delphi; title: ; notranslate">
var
  List : TStringList;
  mtReaper : ImtReaper;
begin
  List := TStringList.Create;
  mtReaper := TmtReaper.Create(List);

  //Use List in your code
  List.LoadFromFile('A File Name');
  List.Sort;
end;
//List will be destroyed automatically by mtReaper
</pre>
</div>
<p>در دلفی ۲۰۰۹ می توان این قابلیت را با استفاده از مفهوم Smart Pointers به شکل مناسب تری پیاده سازی کرد.</p>
<p>۲۷ مهر ۱۳۸۴  (بازنگری: ۱۳ اسفند ۱۳۸۷)</p>
<hr />
<h2>پاورقی</h2>
<p>[۱] &#8211; در واقع تمامی روش های ذکر شده در داخل خود به نوعی از متد GetInterface استفاده می کنند.</p>
<p>[۲] &#8211; Delphi Magazine شماره ۸۰٫</p>
</div>
]]></content:encoded>
			<wfw:commentRss>http://vcldeveloper.com/articles/interfaces_in_delphi/feed/</wfw:commentRss>
		<slash:comments>5</slash:comments>
		</item>
	</channel>
</rss>

<!-- Performance optimized by W3 Total Cache. Learn more: http://www.w3-edge.com/wordpress-plugins/

Minified using disk: basic
Page Caching using disk: enhanced
Database Caching 1/13 queries in 0.086 seconds using disk: basic
Object Caching 1245/1275 objects using disk: basic

Served from: vcldeveloper.com @ 2012-02-04 21:40:03 -->
