PDA

View Full Version : فرق Interface با abstract class



archi
سه شنبه 29 اردیبهشت 1383, 12:20 عصر
سلام من تو چند تا کتاب مفهوم Interface رو خوندم ولی فرقشو با Absract class نفهمیدم . کسی میتونه با یه مثال توضیح بده؟

Abbas Arizi
سه شنبه 29 اردیبهشت 1383, 12:38 عصر
این دو از جهات زیادی به هم شباهت دارن و یکی از وجوه بارز اونها پیاده‌سازی مفهوم چند ریختی است ولی تفاوت اونها در اینه که اینترفیس هیچ گونه پیاده‌سازی متدی نداره ولی در کلاس Abstarct فقط متدهای Abstract پیاده سازی ندارند ولی سایر متدها میتوانند تعریف شوند.
همچنین کلاس Abstract همانند سایر کلاسها به ارث میرسد و تنها متدهای Abstarct باید Override بشوند ولی برای اینترفیس این گونه نیست و اینترفیسها باید به طور کامل در یک کلاس پیاده‌سازی شوند.

اَرژنگ
پنج شنبه 01 آذر 1386, 07:26 صبح
دلایل استفاده از Interface و Absract class به اندازه‌ای از هم متفاوتند که لیست کردن فرقهاشان مانند لیست کردن فرقهایه پیچ‌گوشتی با آچار فرانسه میماند. اگرچه میشه با هر دوشان میخ‌کوبید ولی اینکه بخواهیم فرقهاشان را به این سورت لیست کنیم معنی نمیده.
Interface برایه نشان دادن قابلیتها است. اینکه یک کلاس چه قابلیتهایی دارد.
Absract class برایه نشان دادن نوع کلاس است.
برایه مثال درخت باینری ، از نوع درخت است،دو تا از قابلیتهاش این است که نُدهاش را یکی یکی از کم به زیاد لیست کند یا خودش را سورت کند.
برایه همین اینکه درخت باینری از یک کلاس ابسترکت کلاس "درخت" به ارث ببره و اینترفیسهایه ISortable و IEnumerable را پیاده سازی کند به نظر درست میاد.
حالا میشه در مورد کلی نکات بیربط دیگر یک Interface با یک Abstract Class فرق پیدا کرد ولی هر کدام برایه بیان کردن مفاهیم کاملا مختلفی استفاده میشند.
در ضمن شباهتی که بیان شده "و یکی از وجوه بارز اونها پیاده‌سازی مفهوم چند ریختی است " مفهوم چند ریختی یک نوع نیست، چندین نوع مختلف است، اینترفیس برایه بیان کردن قابلیتهایه چندریختی است و ابسترکت کلاس برایه بیان کردن نوع هایه چند ریختی. پس در اصل این شباهتشان نیست بلکه فرق اصلیشان است.

hassan razavi
پنج شنبه 01 آذر 1386, 12:42 عصر
با کسب اجازه از اساتید.
من توی این بحث شرکت میکنم چون می خواهم اطلاعاتی رو که توی ذهنم دارم و رو بیان کنم ، تا اگه اشتباه هست و مشکلی داره دوستان اصلاح کنند و در نتیجه به اطلاعات صحیح برسم. مثل موضوعی که درباره Singleton بود و دوست بسیار عزیز و دانایم جناب ارژنگ من رو راهنمایی کردند.

یکی فرق بین Interface و Abstract Class اینهست که ، Abstract همینطور که از اسمش پیداست یک کلاس هست ولی Interface یک قانون هست که مشخص میکند که یک کلاس چطوری باید پیاده سازی شود. یک کلاس فقط از یک کلاس Abstract می تواند ارث بپذیرد ولی از n تا interface می تواند ارث ببرد.
در یک interface نمی توان متد را پیاده سازی کرد و یا حتی variables/constants را تعریف کنید ولی در Abstract می توانید.
فرق مهم یک Abstract Class با یک Class این است که شما نمی توانید از یک Abstract Class نمونه سازی کنید (Instance) .

اَرژنگ
پنج شنبه 01 آذر 1386, 14:09 عصر
با کسب اجازه از اساتید.
من توی این بحث شرکت میکنم چون می خواهم اطلاعاتی رو که توی ذهنم دارم و رو بیان کنم ، تا اگه اشتباه هست و مشکلی داره دوستان اصلاح کنند و در نتیجه به اطلاعات صحیح برسم. مثل موضوعی که درباره Singleton بود و دوست بسیار عزیز و دانایم جناب ارژنگ من رو راهنمایی کردند.

یکی فرق بین Interface و Abstract Class اینهست که ، Abstract همینطور که از اسمش پیداست یک کلاس هست ولی Interface یک قانون هست که مشخص میکند که یک کلاس چطوری باید پیاده سازی شود. یک کلاس فقط از یک کلاس Abstract می تواند ارث بپذیرد ولی از n تا interface می تواند ارث ببرد.
در یک interface نمی توان متد را پیاده سازی کرد و یا حتی variables/constants را تعریف کنید ولی در Abstract می توانید.
فرق مهم یک Abstract Class با یک Class این است که شما نمی توانید از یک Abstract Class نمونه سازی کنید (Instance) .
با سلام خدمت جناب رضوی، لطف دارید :)
این فرقهایی که بیان کردید همه درست هستند، ولی سوال واقعی اصلا چیزه دیگریست.
من هم مدتها همین فرقها را به عنوان فرقهایه بینشان فکر میکردم ولی بازهم از این جواب راضی نبودم.
سوال واقعی این نیست که فرق بینشان چی هست، چونکه بین دو ابزار مختلف (مانند پیچ‌گوشتی و آچار فرانسه) فرق زیاد میشه پیدا کرد ولی فایده‌ این نوع تفاوت گذاری بین دو ابزار که هر کدام برایه کاره بخصوصی استفاده میشند . فایده‌ای نداره!

باید پرسید که اینترفیس را برایه چه کاری استفاده میکنیم؟ و ابسترکت کلاس را برایه چه کاری؟

پلیمرفیزم (چند شکلی بودن) نوعهایه متفاوت دارد.
برنامه نویسی در حقیقت یک روش ساختن مدل هست. در ساخن مدل باید بشه ابراز کرد که اشیائ مختلف در مدل به همدیگر چه رابطه‌ای دارند.

Type Polymorphism : برایه ابراز جابجایی نوعی هست. مثالا یک درخت سیب از نوع درخت هستش ولی درخت یک ابسترکت کلاس تعریف شده

Interface Polymorphisim: برایه ابراز جابجایی قابلیت است. اینکه یک لیست داریم و یا یک گراف مهم نیست، اگر هردوشان IEnumerable را پشتیبانی میکنند بدانه دانستن نوعشان میتوانیم از هر دو از طریق قابلیت IEnumarable درخواست کنیم که یکی یکی عضوهاشان را برگردانند.

سوال "فرق بین اینترفیس و ابسترکت کلاس چی هست؟" بیمعنیه.
باید پرسید که برایه چه دلایلی از اینترفیس استفاده میشه و برایه چه دلایلی از ابسترکت کلاس.
اینکه یکی قابلیت پیاده ریزی داره و یا نه ، یا اینکه میشه یکیش را یکبار ارث برد و دیگری را چندین بار، مانند مقایسه کردن فرقهایه فیل و فنجان است.

یک کلاس درست است که از یک ابسترکت کلاس میتواند ارث ببرد ولی وقتی که در مورد اینترفیس حرف میزنیم باید واژه‌هایمان را عوض کنیم.
یک کلاس میتواند که ابراز کند که چه اینترفیسهایی را پشتیبانی میکند (نه اینکه ارث میبرد).
پشتیبانیه یک کلاس از یک اینترفیس و یا ارث بریش از یک ابسترکت کلاس دیدهایه متفاوتی را بین یک کلاس و کلاسهایه دیگر و قابلیتهاش با قابلیتهایه کلاسهایه دیگر که از نظر نوعی به هم هیچ ربطی ندارند را مهیا میکند.

mostafa_shaeri_tj
یک شنبه 28 شهریور 1389, 01:02 صبح
سلام.
یه سوالی برام پیش اومده : چرا c# از ارث بری چندگانه پشتیبانی نمیکنه؟ این یک نقصه ؟

I,Nobody
جمعه 15 خرداد 1394, 01:41 صبح
- کلاس abstract مثل کلاس های دیگه هست با این تفاوت که این امکان رو داره که پیاده سازی متدهایی رو برای کلاسهایی که ازش مشتق میشن، اجباری کنه. کلاس abstract رو نمیتونید final کنید. متدهای abstract نمیتونن private باشند.

- اینترفیس ها فقط پیاده سازی متدهایی رو برای کلاسهایی که از اونها به عنوان رابط استفاده میکنند، اجباری میکنند.
- یک کلاس میتونه از چند اینترفیس implement بشه.
- به هیچ وجه نمی تونید یک متد رو توی interface پیاده سازی کنید.

مثال:

/* example of abstract and using that */
abstract class car{
public abstract function start();
public abstract function drive();
public abstract function stop();
public function enginOff(){
//turn the engine off
}
}


class sedan extends car{
public function start(){
//Turn the engine on
}
public function drive(){
//Change the gear to D
}
public function stop(){
//Change the gear to P
}
}


//===================================


/* example of interface and using that */
interface car{
public function start();
public function drive();
public function stop();
public function enginOff();
}


class sedan implements car{
public function start(){
//Turn the engine on
}
public function drive(){
//Change the gear to D
}
public function stop(){
//Change the gear to P
}
public function enginOff(){
//turn the engine off
}
}

tami64
سه شنبه 03 آذر 1394, 16:02 عصر
سلام خدمت دوستان عزیز. پست های قبلی رو خوندم یا اشتباه جواب داده شده و یا ناقص.
یک توصیه به هیچ عنوان از کتاب های فارسی برای یادگیری شی گرا استفاده نکنید و از مرجع انگلیسی استفاده کنید.

1: نمیتوانیم از
کلاس
Abstract
نمونه (شیئ) ایجاد کنیم. ولی از
Interface میشه.
2: کلاس Interface میتونه multiple-inherited بشه ، یعنی مثلا کلاس گربه از کلاس اینترفیس حیوان و کلاس اینترفیس چهار پایان ارث بری میکنه ولی کلاس ابسترکت نمیتونه
multiple-inherited
بشه.

3: در Interface نمیتوتن data member داشته باشیم یعنی مثلا یک متغییر اینتیجر در private یا public. ولی در Abstract این امر امکان داره.

4: در Interface نمیتوانیم پیاده‌سازی متدی کنیم ولی در Abstract میتوانیم. مثلا یک تابع برای جمع دو عدد.
5:در Abstract حداقل باید یک pure virtual یا به عبارت دیگر یک Abstract یا به عبارت دیگر تابع virtual که مساوی 0 هست داشته باشیم و بقیه توابع میتواند نرمال باشد. ولی در Interface همه توابه باید pure virtual و تابع destructor باید virtual باشد نه pure virtual یعنی مساوی صفر نکنیم و وجودش ضروری هست.



class test // interface class
{
public:
virtual ~test(); // virtual function
virtual void method_1(int x) = 0; // pure virtual function || Abstract Member Function
virtual void method_2(int y) = 0; // pure virtual function || Abstract Member Function
virtual void methpd_3() = 0; // pure virtual function || Abstract Member Function
};

class test // abstract class
{
public:
virtual void method_1() = 0; // pure virtual function || Abstract Member Function
virtual void method_2(); // Virtual function. Non Abstract Member Function1
void method_3(); // Non Abstract Member Function1
};

javady_joon
پنج شنبه 05 آذر 1394, 12:15 عصر
سلام خدمت دوستان عزیز. پست های قبلی رو خوندم یا اشتباه جواب داده شده و یا ناقص.یک توصیه به هیچ عنوان از کتاب های فارسی برای یادگیری شی گرا استفاده نکنید و از مرجع انگلیسی استفاده کنید.1: نمیتوانیم از
کلاس
Abstract
نمونه (شیئ) ایجاد کنیم. ولی از
Interface میشه.
2: کلاس Interface میتونه multiple-inherited بشه ، یعنی مثلا کلاس گربه از کلاس اینترفیس حیوان و کلاس اینترفیس چهار پایان ارث بری میکنه ولی کلاس ابسترکت نمیتونهmultiple-inherited
بشه.
3: در Interface نمیتوتن data member داشته باشیم یعنی مثلا یک متغییر اینتیجر در private یا public. ولی در Abstract این امر امکان داره.
4: در Interface نمیتوانیم پیاده‌سازی متدی کنیم ولی در Abstract میتوانیم. مثلا یک تابع برای جمع دو عدد.5:در Abstract حداقل باید یک pure virtual یا به عبارت دیگر یک Abstract یا به عبارت دیگر تابع virtual که مساوی 0 هست داشته باشیم و بقیه توابع میتواند نرمال باشد. ولی در Interface همه توابه باید pure virtual و تابع destructor باید virtual باشد نه pure virtual یعنی مساوی صفر نکنیم و وجودش ضروری هست.
class test // interface class{ public: virtual ~test(); // virtual function virtual void method_1(int x) = 0; // pure virtual function || Abstract Member Function virtual void method_2(int y) = 0; // pure virtual function || Abstract Member Function virtual void methpd_3() = 0; // pure virtual function || Abstract Member Function };class test // abstract class { public: virtual void method_1() = 0; // pure virtual function || Abstract Member Function virtual void method_2(); // Virtual function. Non Abstract Member Function1 void method_3(); // Non Abstract Member Function1 };
اگر میشه یه کتاب در ازین زمینه با زبان اصلی معرفی کنید ممنون می شم

elec60
جمعه 06 آذر 1394, 00:20 صبح
C# 6.0 in a nutshell

osoleimani75
چهارشنبه 17 شهریور 1395, 17:56 عصر
اگر میشه یه کتاب در ازین زمینه با زبان اصلی معرفی کنید ممنون می شم

این صفحه فکر میکنم که بتونه کمک کنه
http://www.codeproject.com/Articles/11155/Abstract-Class-versus-Interface

javalike
پنج شنبه 01 تیر 1396, 21:57 عصر
سلام من تو چند تا کتاب مفهوم Interface رو خوندم ولی فرقشو با Absract class نفهمیدم . کسی میتونه با یه مثال توضیح بده؟

سایت زیر بصورت کامل کلاس Abstract را با Interface مقایسه کرده است:
http://javapro.ir/news_98966-utab