1. کلاس های انتزاعی می توانند برخی از اعضای خود را پیاده سازی کنند (متدها یا ویژگی هایی که انتزاعی نیستند) در حالی که رابط ها نمی توانند.
- abstract class MyClass {
- private int id;
- public int Id {
- set {
- this.id = value;
- }
- get {
- return this.id;
- }
- }
- }
اگر راه حل خود را بسازیم، خطایی دریافت نمی کنیم.
اما اگر یک ویژگی انتزاعی مانند شکل زیر ایجاد کنیم:
- abstract class MyClass {
- private int id;
- public abstract int Id {
- set {
- this.id = value;
- }
- get {
- return this.id;
- }
- }
- }
سپس وقتی راه حل خود را می سازیم، اکنون یک خطای زمان کامپایل دریافت می کنیم زیرا یک عضو انتزاعی نمی تواند بدنه داشته باشد.
در یک رابط، ما نمی توانیم یک پیاده سازی ارائه کنیم. به عنوان مثال در موارد زیر:
- interface IOne {
- int MyProperty { get; set; }
- }
اگر راه حل خود را بسازیم، خطایی نخواهیم گرفت.
اما اگر بخواهیم آن را به صورت زیر پیاده سازی کنیم:
- interface IOne {
- int MyProperty {
- set {
- }
- get {
- rn 21;
- }
- }
- }
یک خطای زمان کامپایل مانند زیر دریافت خواهیم کرد:
2. کلاس های انتزاعی می توانند فیلد داشته باشند در حالی که رابط ها نمی توانند.
- abstract class MyClass {
- private int id;
- }
اگر راه حل خود را بسازیم، خطایی نخواهیم گرفت.
اگر یک عضو به رابط اضافه کنیم و راه حل خود را بسازیم.
- interface IOne {
- public string name;
- }
ما یک خطا مانند زیر دریافت خواهیم کرد:
3. یک کلاس انتزاعی می تواند از کلاس انتزاعی دیگر و همچنین رابط ها ارث بری کند در حالی که اینترفیس ها فقط می توانند از واسط های دیگر ارث ببرند.
- using System;
- namespace AbstractVsInterfaces {
- class MainClass {
- public static void Main() {
- }
- abstract class MyAbstract {
- }
- interface IOne {
- }
- interface ITwo {
- }
- interface IThree {
- }
- abstract class MyClass : MyAbstract, IOne, ITwo, IThree {
- }
- }
- }