PDA

View Full Version : abstract class یا interface



Peyman_Ranjbar
چهارشنبه 22 شهریور 1385, 03:23 صبح
با سلام خدمت استادان سایت
یه سوالی داشتم که اول مساله رو شرح میدم:

من یک برنامه ساختم که قابلیت کار با انواع پایگاه داده ها رو داشته باشه

اول یک کلاس از نوع abstract درست کردم به اسم DBProvider
مثلا


public abstract class DBProvider
{
public abstract void Add();
public abstract string Get();
.
.
.
}


خوب حالا کلاسهایی که از این کلاس ارث بری دارن میتونن با هر پایگاه داده ای که کلاس فرزند دوست داره کار کنه و به برنامه اصلی هم ربطی نداره که این کلاس چه کار می کنه و با چه پایگاه داده ای کار می کنه

و داخل متد اصلی برنامه هم از این عبارت استفاده کردم



DBProvider dbp = new MyDrivedDBProvider();
dbp.Add();
string foo = dbp.Get();


تا اینجا درسته و من هم مشکلی ندارم و برنامه هم درست با چند تا پایگاه داده کار می کنه.

حالا سوالی که از شما عزیزان دارم اینه که بهتر نیست اون کلاس abstract رو نسازم و به جاش از interface استفاده کنم و بعد هر کلاسی که خواست برای برنامه با پایگاه داده ارتباط برقرار کنه اون interface رو باید پیاده کنه؟
فرق این دو روش چیه؟
اگه زحمتی براتون نیست توضیح بدید.

پیشاپیش از شما تشکر می کنم.:خجالت:

titbasoft
چهارشنبه 22 شهریور 1385, 08:33 صبح
abstract پیاده سازی شده، اما کلاس interface هنوز پیاده سازی نشده.

به عبارت دیگه اگر یک interface رو Implement کنید، شما مجبور خواهید بود همه member هاش رو هم پیاده سازی کنید، اما اگر کلاس abstract رو Inherit کنید، معناش اینه که Member ها پیاده سازی شده اند و شما می تونید ازشون استفاده کنید والبته می تونید تغیراتی هم درش بدید.

یک مثال: یک interface مثل نقشه یک ساختمان می مونه که از روی اون میشه ساختمان رو ساخت. یک کلاس abstract مثل یک ماشین می مونه که یک موتور داره و یک بدنه به شکل مکعب مستطیل + چیزهایی که لازمه تا ماشین راه بره. حالا اون ماشین رو می دن دست شما و می تونید هر بلایی که خواستید سرش بیارید. می تونید از اون یک پیکان بسازید، می تونید هم به یک فراری تبدیلش کنید.

S.Azish
چهارشنبه 22 شهریور 1385, 12:56 عصر
اگر تمام member ها در base کلاس abstract هستن بهتره از interface استفاده کنید ولی اگر در base کلاس کد هم دارید, از همون base کلاس استفاده کنید.

reza_rad
چهارشنبه 22 شهریور 1385, 13:38 عصر
در ادامه صحبتهای آقا هاشم:
http://www.orissa.8m.com/Nabin/Article/InterfaceVsAbstractClass.html

Peyman_Ranjbar
چهارشنبه 22 شهریور 1385, 14:12 عصر
abstract پیاده سازی شده، اما کلاس interface هنوز پیاده سازی نشده.


nدوست عزیز متدها هم abstract هست و تا جایی که می دونم متد abstract رو نمی شه پیاده سازی کرد



اگر تمام member ها در base کلاس abstract هستن بهتره از interface استفاده کنید ولی اگر در base کلاس کد هم دارید, از همون base کلاس استفاده کنید.


من می خواهم این بهتر بودنش رو بدونم برای چیه؟
توی کلاس Base اصلا کد ندارم و همه چیز abstract هست

titbasoft
چهارشنبه 22 شهریور 1385, 14:18 عصر
دوست عزیز متدها هم abstract هست و تا جایی که می دونم متد abstract رو نمی شه پیاده سازی کردبله درسته، اون متد ها رو باید Override کرد. این تناقضی ایجاد میکنه؟

S.Azish
چهارشنبه 22 شهریور 1385, 16:30 عصر
من می خواهم این بهتر بودنش رو بدونم برای چیه؟
توی کلاس Base اصلا کد ندارم و همه چیز abstract هست


Interface ها برای زمانی استفاده میشن که تمام member ها abstract باشن, همه public باشن, Static نباشن و به اشیا دیگر معنی بدن ولی خودشون شی نباشن

برای مثال یک انسان میتونه این interface ها رو داشته باشه

IPerson
IEmployee
ISpouse
IParent
IChild
و غیره و میتونه در هر حالت رفتارهای متفاوتی رو از خودش نمایش بده برای مثال برای خصوصیتی مثل Code زمانی که به IPerson تبدیل بشه میتونه شماره شناسنامه شخص رو برگردونه ولی زمانی که به IEmployee تبدیل بشه شماره کارمندی شخص رو برگردونه ولی باید دقت کرد که شی انسان این خصوصیات رو به ارث نمیبره و بلکه این خصوصیات بهش تعلق میگیره ولی برای وراثت برای مثال از شی پستاندار درست شده و خصوصیات یک پستاندار رو extend کرده.

برای نمونه شما ,باید دید که آیا DBProvider یک شی هست یا فقط یک شی رو تعریف میکنه. اگر خودش شی هست پس باید کد داشته باشه و دارای رفتار خاصی باشه ولی اگر فقط تعریف یک شی هست (interface) پس باید interface باشه

اگر از Interface استفاده کنید خصوصیت دوم برنامه نویسی شی گرا رو اجرا کردید (Polymorphism) ولی اگر کلاس باشه خصوصیت سوم که Inheritance باشه یعنی یک شی جدید تولید کردید بر اساس شی اول ولی با رفتارهای جدید و شاید بیشتر.

Peyman_Ranjbar
پنج شنبه 23 شهریور 1385, 02:59 صبح
ممنون دوست عزیز
مخصوصا اینکه اینجا کاملا روشن کردی:

برای نمونه شما ,باید دید که آیا DBProvider یک شی هست یا فقط یک شی رو تعریف میکنه. اگر خودش شی هست پس باید کد داشته باشه و دارای رفتار خاصی باشه ولی اگر فقط تعریف یک شی هست (interface) پس باید interface باشه


برنامه من اول فقط با یک پایگاه داده کار می کرد ولی بعد از تموم شدن برنامه تصمیم گرفتم که کاری بکنم که چند پایگاه داده رو پشتیبانی کنه(برای آینده.فعلا فقط این قابلیت رو داره)و برای همین کلاس رو abstract کردم و این سوال رو برای این پرسیدم که ببینم آیا لازم هست که اون رو به Intefface تبدیل کنم یا نه.وگرنه خودم در این جور موارد اگه از اول همچنین تصمیمی داشتم از interface استفاده می کردم.
به هر حال از همتون ممنونم .یه چیز جدید یاد گرفتم.

اَرژنگ
پنج شنبه 23 شهریور 1385, 03:29 صبح
http://www.javaworld.com/javaworld/javaqa/2001-04/03-qa-0420-abstract.html

Peyman_Ranjbar
جمعه 24 شهریور 1385, 05:26 صبح
سلام
یه زحمت دیگه هم بکشید و یه توضیح مختصر درباره تفاوتهای
Implementing Interface Implicity و Implementing Interface Explicity بدید.
ممنون