سوال: آیا یک کلاس انتزاعی می تواند سازنده داشته باشد؟ اگر چنین است چه فایده ای دارد؟
پاسخ: بله، یک کلاس انتزاعی می تواند سازنده داشته باشد. به طور کلی برای مقداردهی اولیه فیلدها از سازنده کلاس استفاده می شود. در امتداد همین خطوط، یک سازنده کلاس انتزاعی برای مقداردهی اولیه فیلدهای کلاس انتزاعی استفاده می شود.
بیایید یک مثال را ببینیم.
مرحله 1
ابتدا یک برنامه کنسول به نام InterviewQuestionPart7 ایجاد می کنیم.
گام 2
سپس یک کلاس انتزاعی به نام مشتری ایجاد می کنیم و یک فیلد خصوصی را شامل می کنیم، نوع برگشتی این فیلد خصوصی Guid است که یک شناسه منحصر به فرد جهانی است. حال برای اینکه این فیلد را در معرض دنیای خارجی قرار دهیم، بیایید یک ویژگی عمومی را وارد کنیم و میخواهیم این ویژگی فقط خواندنی باشد و فقط دسترسیهای Get را وارد کنیم.
حال برای مقداردهی اولیه این فیلد خصوصی کلاس انتزاعی، سازنده ای در داخل این کلاس انتزاعی ایجاد می کنیم که همان نام کلاس را دارد و نوع برگشتی ندارد. بنابراین بیایید از این سازنده برای مقداردهی اولیه فیلد خصوصی استفاده کنیم. بنابراین اکنون آن را به عنوان یک شناسه جهانی منحصر به فرد جدید (GUID) مقداردهی اولیه می کنیم، بنابراین با استفاده از کد زیر، متد NewGuid() را در کلاس Guid فراخوانی می کنیم.
- using System;
- using System.Collections.Generic;
- using System.Text;
- namespace InterviewQuestionPart7
- {
- class Program
- {
- static void Main(string[] args)
- {
- }
- public abstract class Customer
- {
- public Customer()
- {
- this._id = Guid.NewGuid();
- }
- private Guid _id;
- public Guid ID
- {
- get
- {
- return this._id;
- }
- }
- }
- }
- }
اکنون در تجارت ما دو نوع مشتری داریم، مشتری شرکتی و مشتری پس انداز. ما دو کلاس ایجاد خواهیم کرد، کلاس CorporateCustomer و کلاس Savings Customer، و آنها از کلاس انتزاعی مشتری ما مشتق خواهند شد.
اکنون نمونه ای از کلاس CorporateCustomer ایجاد می کنیم که از کلاس Customer مشتق شده است و کلاس Customer دارای شناسه عمومی است، بنابراین باید در نمونه کلاس CorporateCustomer در دسترس باشد. و به همین ترتیب ما یک نمونه از کلاس SavingsCustomer ایجاد می کنیم و با استفاده از کد زیر، ویژگی را چاپ می کنیم.
- using System;
- using System.Collections.Generic;
- using System.Text;
- namespace InterviewQuestionPart7
- {
- class Program
- {
- static void Main(string[] args)
- {
- CorporateCustomer cc = new CorporateCustomer();
- Console.WriteLine(cc.ID);
- SavingsCustomer sc = new SavingsCustomer();
- Console.WriteLine(sc.ID);
- }
- public abstract class Customer
- {
- public Customer()
- {
- this._id = Guid.NewGuid();
- }
- private Guid _id;
- public Guid ID
- {
- get
- {
- return this._id;
- }
- }
- }
- public class CorporateCustomer:Customer
- {
- }
- public class SavingsCustomer:Customer
- {
- }
- }
- }
حالا بیایید اجرا کنیم و خروجی را ببینیم. همانطور که انتظار می رفت، شناسه جهانی منحصر به فرد را برای کلاس CorporateCustomer و کلاس SavingsCustomer دریافت می کنیم.
بنابراین در اینجا در کلاس abstract ما از سازنده برای مقداردهی اولیه فیلدهای کلاس abstract استفاده می کنیم.
مرحله 4
اگر بخواهیم فیلدهای خاصی از کلاس انتزاعی را قبل از اینکه نمونه سازی یک کلاس فرزند انجام شود، مقداردهی اولیه کنیم، یک سازنده برای یک کلاس انتزاعی ارائه می کنیم.
در اینجا دو کلاس فرزند داریم، CorporateCustomer و SavingsCustomer که از کلاس انتزاعی Customer مشتق شده اند.
اکنون میخواهیم یک شناسه منحصربهفرد جهانی به فیلد _id اختصاص داده شود، حتی قبل از اینکه نمونهای از مشتریان شرکت یا SavingsCustomer ایجاد شود. این مورد دیگری است که در آن از یک سازنده در کلاس abstract استفاده می کنیم.
اجازه دهید در واقع ثابت کنیم که سازنده کلاس انتزاعی حتی قبل از سازنده کلاس فرزند فراخوانی می شود. برای اثبات اینکه سازنده را در هر دو کلاس مشتق شده با کد زیر قرار می دهیم.
- using System;
- using System.Collections.Generic;
- using System.Text;
- namespace InterviewQuestionPart7
- {
- class Program
- {
- static void Main(string[] args)
- {
- CorporateCustomer cc = new CorporateCustomer();
- Console.WriteLine(cc.ID);
- SavingsCustomer sc = new SavingsCustomer();
- Console.WriteLine(sc.ID);
- }
- public abstract class Customer
- {
- public Customer()
- {
- this._id = Guid.NewGuid();
- }
- private Guid _id;
- public Guid ID
- {
- get
- {
- return this._id;
- }
- }
- }
- public class CorporateCustomer:Customer
- {
- public CorporateCustomer()
- {
- }
- }
- public class SavingsCustomer:Customer
- {
- public SavingsCustomer()
- {
- }
- }
- }
- }
اکنون یک نقطه شکست در سازنده CorporateCustomer و سازنده SavingsCustomer، در سازنده کلاس abstract و در متد Main ایجاد می کنیم. حالا برنامه را Debug کنید و ببینید چه اتفاقی خواهد افتاد.