نمایش نتایج 1 تا 10 از 10

نام تاپیک: abstract class یا interface

  1. #1
    کاربر دائمی آواتار Peyman_Ranjbar
    تاریخ عضویت
    مرداد 1383
    محل زندگی
    شیراز
    پست
    608

    abstract class یا interface

    با سلام خدمت استادان سایت
    یه سوالی داشتم که اول مساله رو شرح میدم:

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

    اول یک کلاس از نوع 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 رو باید پیاده کنه؟
    فرق این دو روش چیه؟
    اگه زحمتی براتون نیست توضیح بدید.

    پیشاپیش از شما تشکر می کنم.

  2. #2
    abstract پیاده سازی شده، اما کلاس interface هنوز پیاده سازی نشده.

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

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

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

  4. #4

  5. #5
    کاربر دائمی آواتار Peyman_Ranjbar
    تاریخ عضویت
    مرداد 1383
    محل زندگی
    شیراز
    پست
    608
    abstract پیاده سازی شده، اما کلاس interface هنوز پیاده سازی نشده.
    nدوست عزیز متدها هم abstract هست و تا جایی که می دونم متد abstract رو نمی شه پیاده سازی کرد

    اگر تمام member ها در base کلاس abstract هستن بهتره از interface استفاده کنید ولی اگر در base کلاس کد هم دارید, از همون base کلاس استفاده کنید.
    من می خواهم این بهتر بودنش رو بدونم برای چیه؟
    توی کلاس Base اصلا کد ندارم و همه چیز abstract هست

  6. #6
    دوست عزیز متدها هم abstract هست و تا جایی که می دونم متد abstract رو نمی شه پیاده سازی کرد
    بله درسته، اون متد ها رو باید Override کرد. این تناقضی ایجاد میکنه؟
    آخرین ویرایش به وسیله titbasoft : پنج شنبه 23 شهریور 1385 در 09:22 صبح
    هر که بر مرکب باطل نشیند ، در سراى پیشمانى فرودش مى‏آورند

  7. #7
    من می خواهم این بهتر بودنش رو بدونم برای چیه؟
    توی کلاس Base اصلا کد ندارم و همه چیز abstract هست
    Interface ها برای زمانی استفاده میشن که تمام member ها abstract باشن, همه public باشن, Static نباشن و به اشیا دیگر معنی بدن ولی خودشون شی نباشن

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

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

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

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

  8. #8
    کاربر دائمی آواتار Peyman_Ranjbar
    تاریخ عضویت
    مرداد 1383
    محل زندگی
    شیراز
    پست
    608
    ممنون دوست عزیز
    مخصوصا اینکه اینجا کاملا روشن کردی:
    برای نمونه شما ,باید دید که آیا DBProvider یک شی هست یا فقط یک شی رو تعریف میکنه. اگر خودش شی هست پس باید کد داشته باشه و دارای رفتار خاصی باشه ولی اگر فقط تعریف یک شی هست (interface) پس باید interface باشه

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

  9. #9

  10. #10
    کاربر دائمی آواتار Peyman_Ranjbar
    تاریخ عضویت
    مرداد 1383
    محل زندگی
    شیراز
    پست
    608
    سلام
    یه زحمت دیگه هم بکشید و یه توضیح مختصر درباره تفاوتهای
    Implementing Interface Implicity و Implementing Interface Explicity بدید.
    ممنون

تاپیک های مشابه

  1. فرق Interface با abstract class
    نوشته شده توسط archi در بخش C#‎‎
    پاسخ: 11
    آخرین پست: پنج شنبه 01 تیر 1396, 21:57 عصر
  2. control class,entity class,boundary class
    نوشته شده توسط ali643 در بخش تحلیل و طراحی نرم افزار
    پاسخ: 12
    آخرین پست: یک شنبه 25 فروردین 1392, 15:22 عصر
  3. پاسخ: 2
    آخرین پست: سه شنبه 16 بهمن 1386, 20:37 عصر
  4. DLL و Abstract
    نوشته شده توسط _alish_ در بخش برنامه نویسی در Delphi
    پاسخ: 14
    آخرین پست: سه شنبه 04 اسفند 1383, 11:06 صبح

قوانین ایجاد تاپیک در تالار

  • شما نمی توانید تاپیک جدید ایجاد کنید
  • شما نمی توانید به تاپیک ها پاسخ دهید
  • شما نمی توانید ضمیمه ارسال کنید
  • شما نمی توانید پاسخ هایتان را ویرایش کنید
  •