در یکی از مقالات قبلی خود توضیح دادم که چرا از رابط در سی شارپ استفاده می کنیم . در سی شارپ، ما یک کلاس بسیار مهم داریم که به عنوان یک کلاس انتزاعی شناخته می شود. یک کلاس انتزاعی می تواند یک یا چند متد داشته باشد که می تواند انتزاعی باشد (فقط امضا). رابط فقط حاوی امضای متد است. یک کلاس انتزاعی چه تفاوتی با یک رابط در سی شارپ دارد؟ این یکی از سوالات مورد علاقه در مصاحبه های C# است: کلاس انتزاعی چیست و چرا از آن استفاده می کنیم؟
در اینجا میتوانید درباره کلمات کلیدی مجازی، لغو، جدید و انتزاعی اطلاعات بیشتری کسب کنید .
کلاس چکیده و تفاوت رابط
کلاس چکیده | رابط |
ما نمی توانیم نمونه ای از این کلاس ایجاد کنیم. | رابط می تواند فقط از نوع متغیر باشد و نمونه نباشد. |
می تواند سازنده داشته باشد. | نمی تواند سازنده داشته باشد. |
می توان آن را به کلاس دیگری مشتق کرد. | برای مشتق شدن توسط کلاس دیگر ایجاد شده است. |
می تواند پیاده سازی (غیر انتزاعی) یک یا چند روش را داشته باشد. | نمی تواند تعریف تابعی داشته باشد. |
کلاس Concrete فقط می تواند یک کلاس انتزاعی را پیاده سازی کند | کلاس Concrete می تواند بسیاری از اینترفیس ها را پیاده سازی کند |
می تواند یا نمی تواند شامل روش های انتزاعی باشد | فقط باید امضاهای متد را داشته باشد. |
این می تواند دارای اعضای داده خصوصی، محافظت شده و داخلی باشد. | همه اعضا به طور پیش فرض عمومی هستند. |
نمی توان آن را از یک ساختار استخراج کرد. | می توان آن را توسط یک ساختار استخراج کرد. |
اجرای عملی کلاس چکیده
بیایید در مورد اجرای عملی کلاس انتزاعی صحبت کنیم. اکثر مردم در مورد تئوری این کلاس ها بسیار آگاه هستند، اما تا آنجا که به پیاده سازی مربوط می شود، در مورد آن مطمئن نیستند.
- public abstract class DataSource
- {
- protected string dataSourceName;
- private string environment;
- protected DataSource(string environment, string dsName) {
- this.environment = environment;
- this.dataSourceName = dsName;
- GetDataSourceCredentials();
- }
- private void GetDataSourceCredentials() {
- Console.WriteLine(string.Format("Get {0}'s connection setting for {1} environment from config file", dataSourceName, environment));
- }
- public abstract void OpenAndReturnConnection();
- }
- public class MsSqlDataSource: DataSource {
- public MsSqlDataSource(string environment): base(environment, "MsSQL") {}
- public override void OpenAndReturnConnection() {
- Console.WriteLine(string.Format("Create and return Connection for {0} dataSource", dataSourceName));
- }
- }
- public class OracleDataSource: DataSource {
- public OracleDataSource(string environment): base(environment, "Oracle") {}
- public override void OpenAndReturnConnection() {
- Console.WriteLine(string.Format("Create and return Connection for {0} dataSource", dataSourceName));
- }
- }
باید بدانیم که یک کلاس انتزاعی می تواند پیاده سازی خود را برای متدها داشته باشد. در کد داده شده در بالا، من یک کلاس پایه انتزاعی به نام DataSource ایجاد کرده ام . این کلاس از کلاس های بتن یعنی sSqlDataSource و OracleDataSource مشتق شده است.
کلاس بتن راه خود را برای باز کردن اتصال خواهد داشت. باید یک راه متداول برای دریافت رشته اتصال برای فایل پیکربندی وجود داشته باشد.
در برنامه ما، ممکن است این شانس وجود داشته باشد که مجبور شویم از منابع داده مختلف مانند سرور Ms SQL، سرور Oracle یا شاید فایل MS Excel استفاده کنیم. در کدی که در بالا ذکر شد، من یک روش خصوصی برای دریافت رشته اتصال منبع داده از فایل پیکربندی، بر اساس نام منبع داده و محیط (مانند DEV، QA یا PROD) دارم.
حالا اگر کد زیر را اجرا کنید:
- DataSource sqlDS = new MsSqlDataSource("DEV");
- sqlDS.OpenAndReturnConnection();
من خروجی زیر را دریافت خواهم کرد:
اگرچه، این یک مثال بسیار ابتدایی و کوچک است، اما می تواند به شما در درک استفاده از یک کلاس انتزاعی کمک کند.
نتیجه
در این مقاله در مورد کلاس انتزاعی و تفاوت های آن با یک رابط صحبت کرده ام. مقاله همچنین شامل یک مثال کوچک است که شما را در مورد کلاس انتزاعی درک می کند.