مفاهیم ، مبانی و اصول شی گرایی (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 سه انتخاب در پیش روی ما قرار دارد که در تصویر زیر ملاحظه می نمایید :

شاید این مطالب را هم دوست داشته باشید

پاسخ دهید

نشانی ایمیل شما منتشر نخواهد شد. بخش‌های موردنیاز علامت‌گذاری شده‌اند *