آموزش: آموزش برنامه نویسی شئ گرا در زبان سی شارپ - قسمت پانزدهم - آشنایی با سازنده ها و روش های ایجاد اشیاء
پنجشنبه, ۳۱ فروردين ۱۳۹۶، ۰۲:۲۳ ب.ظ
در قسمت قبلی آموزش در مورد خصوصیات یا Property ها و نحوه صحیح استفاده از
آنها در کلاس ها صحبت کردیم. در این بخش در مورد سازنده ها یا
Constructors، مقدار دهی اولیه اشیاء (Object Initialization) و نوع های
بدون نام (Anonymous Types) صحبت می کنیم.
زمانی که شما کلاسی را تعریف می کنید، این کلاس حاوی یکسری خصوصیات و یکسری
رفتارها یا همان متدها می باشد. شما بعد از ایجاد شئ، خصوصیات را مقدار
دهی کرده و از شئ استفاده می کنید. اما چندین راه دیگر برای مقدار دهی
خصوصیات و آماده سازی اولیه کلاس وجود دارد. ما در این قسمت دو روش مختلف
را بررسی می کنیم:
- مقدار دهی اولیه شئ یا Object Initialization
- استفاده از سازنده ها یا Constructors
مقدار دهی اولیه با کمک Object Initialization
در این روش، شما زمانی که اقدام به ایجاد یک شئ می کنید، می توانید مقادیر خصوصیات و فیلدهای آن را مشخص کنید. کلاس Person را در نظر بگیرید:
public class Person { public string FirstName; public string LastName; }
به صورت پیش فرض، شما یک شئ از کلاس ساخته و خصوصیات آن را مقدار دهی می کنید:
var person = new Person(); person.FirstName = "mobin"; person.LastName = "khosravi";
مقدار دهی اولیه شئ کار ساده ایست، کافیست پس از نوشتن () بعد از نام کلاس در قسمت new بین علامت های {} مقادیر خصوصیات را مشخص کنیم:
var person = new Person() { FirstName = "mobin", LastName = "khosravi" };
با این کار مقادیر FirstName و LastName در کلاس Person مقدار دهی اولیه خواهند شد. می توانید در این حالت، از نوشتن () صرفنظر کنید:
var person = new Person { FirstName = "mobin", LastName = "khosravi" };
دقت کنید، در هنگام مقدار دهی اولیه قابلیت صدا زدن متدهای کلاس را نخواهید داشت و تنها می توانید فیلدها، خصوصیات و برخی اعضای دیگر که در قسمت های بعدی با آن آشنا خواهیم شد را مقدار دهی کنید.
سازنده ها یا Constructors
اگر دقت کرده باشید، زمانی که شئ ای را تعریف می کنیم، بعد از نوشتن نام کلاس بعد از کلمه new از () استفاده می کنیم، مشابه زمانی که تصمیم به صدا زدن یک متد دارید. دلیل اینکار، پروسه ایست که سی شارپ برای ایجاد کردن کلاس ها انجام می دهد. زمانی که شما شئ ای از یک کلاس ایجاد می کنید، سی شارپ قسمتی با نام سازنده یا Constructor را برای آن کلاس صدا می زند. این سازنده یک متد می باشد که می تواند بدون پارامتر یا با پارامتر باشد و داخل آن کدی نوشته می شود که می خواهیم در هنگام ایجاد شئ اجرا شود. با یک مثال ساده سازنده ها را بررسی می کنیم. کلاس Person را در نظر بگیرید، برای این کلاس یک سازنده تعریف می کنیم که مقادیر FirstName و LastName را به عنوان ورودی گرفته و خصوصیات مربوطه را مقدار دهی می کند:
public class Person { public Person(string firstName, string lastName) { this.FirstName = firstName; this.LastName = lastName; } public string FirstName { get; set; } public string LastName { get; set; } }
در کد بالا، قسمت سانده برای کلاس Person با دو پارامتر تعریف شده است. به شیوه تعریف سازنده دقت کنید، ابتدا سطح دسترسی به سازنده مشخص شده، سپس نام کلاس نوشته شده که برای سازنده ها، این نام دقیقاً باید معادل نام کلاس باشد، سپس پارامترهای مورد نظر و بعد از آن ها بدنه سازنده. دقت کنید سازنده ها مقدار بازگشتی ندارند. با توضیحات گفته شده می توان ساختار کلی سازنده را به صورت زیر بیان کرد:
{access-modifier} {class-name}([parameters]) { // constructor body }
همچنین در بدنه سازنده بالا، به کلمه کلیدی this دقت کنید. کلمه کلیدی this به شئ جاری که روی کلاس ساخته شده است اشاره می کند. فرض کنید شما ده ها شئ از روی یک کلاس ساخته اید، زمانی که یک رفتار را صدا می زنید و داخل آن رفتار از کلمه کلیدی this استفاده می کنید، this به همان شئ ای اشاره می کند که رفتار در آن صدا زده شده است. در این سازنده نیز کلمه کلیدی this به شئ ای اشاره می کند که سازنده برای آن صدا زده شده.
پس از تعریف سازنده می توان هنگام ایجاد شئ، مقادیر مورد نظر را به سازنده ارسال کرد:
var person = new Person("mobin", "khosravi");
با اجرای کد بالا، خصوصیت های FirstName و LastName هنگام ایجاد شئ، مقدار دهی خواهند شد. اما باید به یک نکته در اینجا توجه داشت، زمانی که شما سازنده ای به همراه پارامتر برای یک کلاس تعریف می کنید، دیگر نمی توانید از کلاس بدون ارسال پارامتر در سازنده شئ بسازید. دلیل این موضوع، عدم وجود سازنده ای به نام سازنده پیش فرض یا Default Constructor می باشد. سازنده پیش فرض، سازنده ایست که هیچ پارامتری را به عنوان ورودی نمی گیرد. زمانی که شما سازنده ای برای یک کلاس تعریف نکرده اید، آن کلاس به صورت پیش Default Constrcutor برایش تعریف شده است. اما زمانی که اقدام به ایجاد یک سازنده برای کلاس کردید، اگر می خواهید از آن کلاس بدون ارسال پارامتر برای سازنده شئ بسازید، باید سازنده پیش فرض را به صورت دستی برای آن کلاس بنویسید:
public class Person { public Person() { } public Person(string firstName, string lastName) { this.FirstName = firstName; this.LastName = lastName; } public string FirstName { get; set; } public string LastName { get; set; } }
شما می توانید سطح دسترسی به سازنده ها را مشخص کنید، برای مثال، حالتی پیش می آید که می خواهد یک سازنده فقط داخل همان کلاس در دسترس باشد، یعتی شما از یک کلاس داخل خودش، مثلاً داخل یک رفتار، می خواهید یک شئ بسازید. برای این کار، می توانید سطح دسترسی سازنده مد نظر را private تعریف کنید. برای مثال:
public class Person { public Person() { } private Person(string firstName, string lastName) { this.FirstName = firstName; this.LastName = lastName; } public Person CreateObject(string firstName) { return new Person(firstName, null); } public string FirstName { get; set; } public string LastName { get; set; } }
در کد بالا، یک متد یا رفتار برای کلاس تعریف کردیم با نام CreateObject. این رفتار یک شئ از روی خود کلاس Person می سازد و پارامتر ارسالی به متد CreateObject را به سازنده ارسال می کند. اما خارج از شئ، دیگر نمی توانیم از سازنده ای که دو پارامتر را به عنوان ورودی می گیرد استفاده کنیم، زیرا این سازنده با سطح دسترسی private تعریف شده است.
همانند متدها، سازنده ها می توانند overload داشته باشند، یعنی چند سازنده با signature های متفاوت. برای مثال، کلاس Person را به صورت زیر تغییر می دهیم:
public class Person { public Person() { } public Person(string firstName) { this.FirstName = firstName; } public Person(string firstName, string lastName) { this.FirstName = firstName; this.LastName = lastName; } public string FirstName { get; set; } public string LastName { get; set; } }
در اینجا دو سازنده برای کلاس تعریف کردیم که اولی یک پارامتر گرفته و دومی با دو پارامتر صدا زده می شود.
زنجیره سازنده ها یا Constrcutor Chaining
زمانی که شما چندین سازنده دارید، می توانید از کد های نوشته شده داخل یک سازنده در سازنده دیگر استفاده کنید. برای اینکار از قابلیت constructor chaining استفاده می شود. با یک مثال ادامه می دهیم، در کد قبلی سه سازنده داشتیم، سازنده پیش فرض، سازنده ای که تنها FirstName را می گرفت و سازنده ای که FirstName و LastName را به عنوان پارامتر می گرفت. در سازنده دوم، می توان از سازنده سوم جهت مقدار دهی استفاده کرد. برای این کار، کد بالا را به صورت زیر تغییر می دهیم:
public class Person { public Person() { } public Person(string firstName) : this(firstName,null) { } public Person(string firstName, string lastName) { this.FirstName = firstName; this.LastName = lastName; } public string FirstName { get; set; } public string LastName { get; set; } }
سازنده دوم ما به صورت زیر تغییر کرده است:
public Person(string firstName) : this(firstName,null) { }
دقت کنید، بعد از بستن پرانتز پس از علامت : از کلمه کلیدی this مانند یک متد استفاده کرده ایم، در این روش، سازنده کلاس صدا زده شده و به عنوان پارامتر اول، firstName که در سازنده تعریف شده را ارسال کرده و عنوان پارامتر دوم مقدار null را ارسال کرده ایم. قابلیت constrcutor chaining، در کاهش تعداد خطوط نوشته در برنامه کمک زیادی به ما می کند.
به این نکته توجه داشته باشید که نمی تواند سازنده را به صورت متد از داخل کلاس جایی غیر از خود سازنده ها صدا زد. همچنین سازنده ها تنها برای مقدار دهی خصوصیات استفاده نمی شوند، شما می توانید هر کدی را داخل سازنده بنویسید.
نوع های بدون نام یا Anonymous Types
نوع های بدون نام، به ما این امکان را می دهند تا شئ ای بدون تعریف کلاس ایجاد کنیم. این شئ تنها می تواند شامل خصوصیات باشد و قابلیت تعریف رفتار برای آن را نخواهیم داشت. در مثال زیر یک شئ بدون نام ایجاد کرده ایم که سه خصوصیت با نام FirstName و LastName و Age دارد:
var anonymous = new { FirstName = "mobin", LastName = "khosravi", Age = 17 }; Console.WriteLine(anonymous.FirstName + " " + anonymous.LastName);
همانطور که در کد مشاهده می کنید، کافیست بعد از کلمه کلیدی new بلافاصه به سراغ عملیات Object Initialization برویم و نیازی به نوشتن نام کلاس نیست. نوع های بدون نام کاربردهای زیادی در بخش LINQ دارند که در همین وب سایت دوره آموزشی LINQ توسط بنده نوشته شده و در این دوره آموزشی نیز مروری کوتاه بر این قابلیت خواهیم داشت. در بخش بعدی آموزش، مبحث وراثت یا Inheritance که مهمترین مبحث در زمینه برنامه نویسی شئ گرا می باشد را آغاز خواهیم کرد
منبع:programming.itpro.ir
- ۹۶/۰۱/۳۱