مفاهیم ، مبانی و اصول شی گرایی (OOP) قسمت دوم
مفاهیم ، مبانی و اصول شی گرایی (OOP) قسمت دوم
در قسمت قبل با ساخت کلاس و همچنین ایجاد یک شی (وحله) از یک کلاس آشنا شدیم ، در این بخش قصد داریم بیشتر از پیش به جزئیات یک کلاس پرداخته و با مفاهیم مهمی چون Constuctor و Overloading متد ها آشنا شویم .
در قسمت قبل یک کلاس به نام Human به صورت زیر ایجاد کردیم :
Imports Microsoft.VisualBasic Public Class Human Public Age As Integer = 0 Public Height As Integer = 0 Public Sub Grow() Age = Age + 1 Height = Height + 10 End Sub Public Function Talk(ByVal Words As String) Return “He said : ” + Words End Function End Class |
این کلاس شامل دو متغیر به نام های Age و Height و همچنین دو متد به نام های Talk و Grow می باشد .
فرض کنید شما میخواهید هنگام ایجاد یک شی جدید از کلاس انسان قد پیشفرض این شی را تعیین کنید بدون اینکه از خارج از کلاس Human به متغیر Height مقدار دهی کنیم . برای این کار ما از Constructor استفاده می کنیم .
حال سوال این هست که این Constructor چیست ؟
معنی لغوی Constructor سازنده هست یعنی سازنده کلاس !
معنی کاربردی آن در اینجا یک متد است که در هنگام ساخته شدن کلاس به صورت خودکار فراخوانی میگردد .
Constructor یک ساب روتین هست که به شکل زیر (با نام New) در کلاس نوشته میشود و در هنگام ایجاد شدن یک شی جدید از کلاس فراخوانی می شود :
Public Sub New() End Sub |
Constructor هم مثل همه ساب روتین های دیگر می تواند ورودی داشته باشد :
Public Sub New(ByVal InputHeight As Integer) End Sub |
این کار به ما کمک می کند که در هنگام ایجاد یک شی جدید از این کلاس کاربر مقدار ورودی InputHeight را الزاما وارد نماید .
حال کافیست ما این مقدار ورودی را به متغیر Height ارسال کنیم :
Public Sub New(ByVal InputHeight As Integer) Height = InputHeight End Sub |
حال به سراغ صفحه Default.aspx میرویم و یک وحله جدید از این کلاس ایجاد می کنیم :
Dim Ali As New Human(50) Response.Write(Ali.Height) |
کد فوق یک شی جدید به نام Ali از کلاس Human ایجاد و مقدار ۵۰ را در ورودی Constructor قرار میدهد . حال اگر مطابق کد فوق مقدار Height را چاپ کنیم متوجه خواهیم شد که این مقدار برابر ۵۰ است چرا که در هنگام تولد Ali قد او را ۵۰ سانتی متر تعیین نمودیم .
اکنون که با Constructor آشنا شدیم به سراغ OverLoading میرویم . اگر میخواهید بدانید که Overload کردن چیست به مثال زیر توچه کنید :
همانطور که ملاحظه کردید در کلاس Human یک متد به نام Grow وجود داشت که باعث رشد شی ما میشد . ولی این متد فقط قادر بود یک واحد به سن و ۱۰ واحد به قد شی ما اضافه کند ، در صورتی که ما بخواهیم به میزان دلخواه به این دو متغیر اضافه کنیم می بایست مقادیر قد و سن به صورت ورودی از متد Grow دریافت و به متغیر های Height و Age اضافه گردد پس داریم :
Public Sub Grow(ByVal iHeight As Integer, ByVal iAge As Integer) Age = Age + iAge Height = Height + iHeight End Sub |
متد جدید ما مقادیر IHeight و IAge را از ورودی دریافت به متغیر های Height و Age اضافه می کند .
شاید شما فکر کنید که خوب با این کار ما متد اولیه Grow که ورودی نداشت و برای افزایش یک واحد به کار می رفت را از دست دادیم ! ولی چنین نیست OverLoading متد ها باعث می شود که شما بتوانید چندین متد را با نام ها و خروجی های یکسان و ورودی های متفاوت ایجاد کنید .
دقت کنید که حتما در هر Overload باید تعداد ورودی ها متفاوت باشد .
پس اکنون دو متد با نام های یکسان Grow و ورودی های متفاوت داریم :
Public Sub Grow() Age = Age + 1 Height = Height + 10 End Sub Public Sub Grow(ByVal iHeight As Integer, ByVal iAge As Integer) Age = Age + iAge Height = Height + iHeight End Sub |
در هنگام استفاده از این متد در کلاس های دیگر شما میتوانید به دلخواه از هر دو این متدها استفاده نمایید :
Dim Ali As New Human(60) Ali.Grow() Ali.Grow(20, 2) Response.Write(Ali.Height) |
در قطعه کد فوق قبل از اجرا حدس بزنید که در هنگام چاپ چه عددی به عنوان قد Ali چاپ خواهد شد ؟
بله حدس شما کاملا درست است مقدار ۹۰ سانتی متر ، چرا ؟
در هنگام ایجاد شی Ali مقدار پیشفرض قد را ۶۰ سانتی متر قرار دادیم .
با اجرای متد Ali.Grow بدون ورودی ، قد ۱۰ سانتی متر دیگر افزایش یافت .
با اجرای متد Ali.Grow(20,2) قد او ۲۰ سانتی متر دیگر نیز افزایش یافت پس اکنون قد او ۹۰ سانتی متر است .
حال سن او را حدس بزنید ؟!
نکته جالب این هست که Constructor ها هم مانند همه متد ها Overloading دارند .
همانطور که دیدید در Constructor کلاس Human مقدار InputHeight الزاما دریافت می شد . اگر بخواهیم این الزام را بر داریم باید یک Constructor دیگر تعریف کنیم که ورودی InputHeight را نداشته باشد :
Public Sub New() End Sub Public Sub New(ByVal InputHeight As Integer) Height = InputHeight End Sub |
همانطور که در کد فوق ملاحظه می کنید Constructor ما به دو روش Overload شده است ، این کار باعث می شود که کاربر بتواند بر حسب نیاز خود نحوه ساخت شی از کلاس را انتخاب نماید.
من یک Overload دیگر هم برای تفهیم بیشتر به Constructor اضافه می کنم :
Public Sub New() End Sub Public Sub New(ByVal InputHeight As Integer) Height = InputHeight End Sub Public Sub New(ByVal InputHeight As Integer, ByVal InputAge As Integer) Age = InputHeight End Sub |
حال در هنگام ایجاد یک شی جدید از کلاس Human سه انتخاب در پیش روی ما قرار دارد که در تصویر زیر ملاحظه می نمایید :
آخرین دیدگاهها