سوال: آیا می توانید یک متد انتزاعی را از سازنده کلاس انتزاعی فراخوانی کنید؟
پاسخ: بله.
بیایید به یک مثال نگاه کنیم.
مرحله 1
ابتدا یک نام برنامه کنسول به عنوان InterviewQuestionPart8 ایجاد می کنیم.
گام 2
اکنون یک کلاس انتزاعی ایجاد می کنیم که آن را Customer می نامیم و سپس یک متد انتزاعی به نام Print() ایجاد می کنیم، بیایید اکنون یک سازنده قرار دهیم و متد Print() را در سازنده با کد زیر فراخوانی کنیم.
- using System;
- using System.Collections.Generic;
- using System.Text;
- namespace InterviewQuestionPart8
- {
- class Program
- {
- static void Main(string[] args)
- {
- }
- public abstract class Customer
- {
- public Customer()
- {
- Print();
- }
- public abstract void Print();
- }
- }
- }
در اینجا ما این متد انتزاعی را در سازنده کلاس انتزاعی فراخوانی می کنیم، بنابراین آیا می توانید یک متد انتزاعی را از سازنده کلاس انتزاعی فراخوانی کنید، پاسخ بله است .
حالا متد انتزاعی در کلاس abstract پیاده سازی ندارد پس فراخوانی متد abstract از سازنده یک کلاس انتزاعی برای پاسخ به این سوال چه فایده ای دارد.
مرحله 3
بیایید کلاس دیگری به نام Savings Customer ایجاد کنیم و آن را از کلاس مشتری انتزاعی به ارث ببریم، اکنون پیادهسازی را برای روش چاپ انتزاعی ارائه میکنیم.
بیایید یک کلاس دیگر به نام CorporateCustomer ایجاد کنیم و به طور مشابه آن را از کلاس مشتری انتزاعی به ارث برده و برای روش چاپ انتزاعی پیاده سازی کنیم.
- using System;
- using System.Collections.Generic;
- using System.Text;
- namespace InterviewQuestionPart8
- {
- class Program
- {
- static void Main(string[] args)
- {
- }
- public abstract class Customer
- {
- public Customer()
- {
- Print();
- }
- public abstract void Print();
- }
- public class SavingsCustomer : Customer
- {
- public override void Print()
- {
- Console.WriteLine("SavingsCustomer class Print method invoked");
- }
- }
- public class CorporateCustomer : Customer
- {
- public override void Print()
- {
- Console.WriteLine("CorporateCustomer class Print method invoked");
- }
- }
- }
- }
حال بیایید نمونه هایی از کلاس های مشتق شده را در متد Main با کد زیر ایجاد کنیم.
- using System;
- using System.Collections.Generic;
- using System.Text;
- namespace InterviewQuestionPart8
- {
- class Program
- {
- static void Main(string[] args)
- {
- SavingsCustomer sc = new SavingsCustomer();
- CorporateCustomer cc = new CorporateCustomer();
- }
- public abstract class Customer
- {
- public Customer()
- {
- Print();
- }
- public abstract void Print();
- }
- public class SavingsCustomer : Customer
- {
- public override void Print()
- {
- Console.WriteLine("SavingsCustomer class Print method invoked");
- }
- }
- public class CorporateCustomer : Customer
- {
- public override void Print()
- {
- Console.WriteLine("CorporateCustomer class Print method invoked");
- }
- }
- }
- }
حالا اجرا کنید و خروجی را ببینید.
اکنون ما متد Print() را در Main() به طور صریح فراخوانی می کنیم، پس چگونه فراخوانی می شود؟
شرح کد
بنابراین به این کلاس ها، کلاس SavingsCustomer و کلاس انتزاعی مشتری نگاه کنید. آنها از طریق ارث با یکدیگر مرتبط هستند. اکنون میدانیم که وقتی نمونهای از کلاس مشتق شده ایجاد میکنیم سازنده کلاس والد به طور خودکار فراخوانی میشود و برای کلاس Savings کلاس والد کلاس Customer است و در سازنده آن کلاس، متد Print() را فراخوانی میکنیم، بنابراین این Print را لغو میکنیم. () روش به طور خودکار فراخوانی می شود.