پاسخ : برنامه نویسی شیئ گرا در vb.net اینترفیسها اینترفیس یک قرارداد است. هر شیئ که پیاده سازی میشود، برای تامین پیاده سازی اعضای تعیین شده در آن اینترفیس یک ضمانت نامه اینترفیس میگیرد. اگر یک شیئ نیاز به تعامل با اینترفیسی داشته باشد، میتواند با هر شیئ که آن اینترفیس را پیاده سازی میکند تعامل داشته باشد. یک اینترفیس فقط اعضایی را تعریف میکند که بوسیله شیئ که بعدا پیاده سازی خواهد شد ساخته میشود. تعریف اینترفیس هیچ اطلاعاتی درباره پیاده سازی اعضاء جز پارامترهایی که میگیرند و نوع مقادیری که آنها برخواهند گرداند، نمیدهد و پیاده سازی اینترفیسها کاملا به پیاده سازی کلاس واگذار میشود. بنابراین این امکان دارد که در اشیاء مختلف پیاده سازیهای مختلفی از اعضای مشابه داشته باشیم. به عنوان مثال، اینترفیسی به نام IShape که یک متد CalculateArea تعریف میکند. کلاس Circle این اینترفیس را برای محاسبه مساحت خود، به طریق متفاوتی با کلاس Square پیاده سازی میکند. هر چند که یک شیئ که نیاز به تعامل با IShapeدارد میتواند متد CalculateArea را فراخوانی کند و هر دوی Circle یا Square نتایج درستی میدهند
پاسخ : برنامه نویسی شیئ گرا در vb.net تعریف اینترفیسها اینترفیسها با کلمه کلیدی Interface تعریف میشوند. Public Interface IDrivable End Interface این اعلان اینترفیس IDrivable را تعریف میکند اما هیچ عضوی برای آن تعریف نمیکند. متدهای یک عضو باید با امضای متد تعریف شود، اما بدون بدون تعریف سطح دسترسی مثل Public و Private. سطح دسترسی یک اینترفیسس سطح دسترسی اعضای آن اینترفیس را نیز تعیین میکند. پس اگر یک اینترفیس Public داشته باشید، همه اعضایش هم باید Public باشند. مثال زیر نشان میدهد که چطور متدها را به اینترفیس اضافه کنید: کد: Public Interface IDrivable Sub GoForward(ByVal Speed As Integer) Sub Halt() Function DistanceTraveled() As Integer End Interface</pre> همچنین شما میتوانید خصوصیات را نیز به اینترفیسها اضافه کنید. خصوصیت باید ReadOnly یا WriteOnly تعریف شوند. مثال زیر را ببینید: کد: Public Interface IDrivable ‘ This defines a read-only property. ReadOnly Property FuelLevel() As Integer End Interface</pre> اگرچه شما میتوانید خصوصیات را در اینترفیسها تعریف کنید، اما نمیتوانید فیلدها را در آنها تعریف کنید. این شرط تضمین میکند که کلاسهایی که از طریق اینترفیسها تعامل دارند به دادهای درونی یک شیئ دسترسی نداشته باشند. اینترفیسها همچنین میتوانند رویدادها را تعریف کنند: کد: Public Interface IDrivable Event OutOfFuel(ByVal sender As Object, e As System.EventArgs)
پاسخ : برنامه نویسی شیئ گرا در vb.net چند شکلی با اینترفیسها (Polymorphism with Interfaces) هر شیئ که یک اینترفیس خاص را پیاده سازی میکند، میتواند با هر یک از اشیاء دیگری که به آن اینترفیس نیاز دارند، تعامل کند. کد: Public Sub GoSomewhere(ByVal v As IDrivable) ‘ Implementation omitted End Sub</pre> این متد نیاز به یک پیاده سازی از اینترفیس IDrivable دارد. هر شیئ که این اینترفیس را پیاده سازی میکند میتواند به عنوان یک پارامتر به این متد پاس داده شود. وقتی یک شیئ توسط اینترفیسش تعامل میکند، فقط اعضاء آن اینترفیس در دسترس هستند. شما همچنین میتوانید به طور ضمنی اشیایی که اینترفیس خاصی را پیاده سازی میکنند درست کنید. (توجه کنید در این مثال Truck باید IDrivable را پیاده سازی کند) کد: Dim myTruck As New Truck() Dim myVehicle As IDrivable ‘ Casts myTruck to the IDrivable interface myVehicle = CType(myTruck, IDrivable)</pre>
پاسخ : برنامه نویسی شیئ گرا در vb.net پیاده سازی اینترفیسها در VB</acronym>.Net اینترفیسها بوسیله کلاسها و ساختارها (Structures) با کلمه کلیدی Implements پیاده سازی میشوند: کد: Public Class Truck Implements IDrivable ‘ Additional implementation code omitted End Class</pre> کلاسها میتوانند چندین اینترفیس را پیاده سازی کنند. اگر بخواهید کلاسی تعریف کنید که چندین اینترفیس را پیاده سازی کند، میتوانید نام اینترفیسها را با کاما از هم جدا کنید. مثال زیر را ببینید: کد: Public Class Truck Implements IDrivable, IFuelBurning, ICargoCarrying ‘ Additional implementation code omitted End Class</pre> وقتی یک کلاس یا ساختاری یک اینترفیس را پیاده سازی میکند، شما باید برای هر یک از اعضای آن اینترفیس پیاده سازی جداگانهای انجام دهید. اگر اینترفیسهای چندگانه پیاده سازی شوند، باید یک پیاده سازی برای هر عضو هر اینترفیسی انجام دهید.
پاسخ : برنامه نویسی شیئ گرا در vb.net پیاده سازی اعضای اینترفیسها در VB</acronym>.NET، یک عضو کلاس با کلمه کلیدی Implements یک عضو اینترفیس را پیاده سازی میکند. عضو کلاسی که عضو اینترفیس را پیاده سازی میکند باید امضایی مشابه آن چه در اینترفیس تعریف شده، داشته باشد. اما نیاز نیست که سطح دسترسی مشابهی با آن داشته باشد. مثال بعد نشان میدهد چگونه یک عضو اینترفیس تعریف میشود. کد: Public Interface IDrivable Sub GoForward(ByVal Speed As Integer) End Interface Public Class Truck Implements IDrivable Public Sub GoForward(ByVal Speed As Integer) Implements IDrivable.GoForward ‘ Implementation omitted End Sub End Class</pre> عضو کلاسی که یک عضو اینترفیس را پیاده سازی میکند مجبور نیست که نامی مشابه نام عضو اینترفیس داشته باشد. مثال بعد یک پیاده سازی کاملا معتبر متد GoForward از اینترفیس IDrivable را نشان میدهد: کد: Public Sub Move(ByVal Speed As Integer) Implements IDrivable.GoForward ‘ Implementation omitted End Sub</pre> هر فراخوانی متد GoForward از اینترفیس IDrivable در مثال قبل، متد Move را از کلاس Truck اجرا میکند. همچنین شما میتوانید سطح دسترسی متفاوتی را برای متد کلاسی که متد اینترفیس را پیاده سازی میکند در نظر بگیرید. به عنوان مثال میتوانید متد Public اینترفیس را متد Private کلاس پیاده سازی کنید. اگر این روش را انجام دهید، وقتی که دسترسی درون اینترفیس است متد Public میشود، اما وقتی دسترسی به عنوان عضوی از کلاس است Private میماند.
پاسخ : برنامه نویسی شیئ گرا در vb.net وراثت چند شکلی وراثت اجازه میدهد که کلاس جدیدی تعریف کنید که تمام اعضاء و اعمال یک کلاس که قبلا تعریف شده را در خود داشته باشد. به این ترتیب میتوانید کلاسهایی درست کنید که اعمال پایه و مشترکی را انجام دهند و سپس زیر کلاسهای خاصی تولید کنید که خدمات متفاوت اما مرتبطی ارائه دهند. در این بخش یاد میگیرید که چگونه از وراثت برای مشتق کردن کلاسهای جدید از کلاسهای پایه استفاده کنید، چطور پیاده سازی جدیدی از اعضای یک کلاس پایه انجام دهید و چطور کلاسهای پایه مجرد درست کنید. وراثت وراثت این امکان را به شما میدهد که چندین کلاس تولید کنید که از هم متمایزند اما در برخی از اعمال با هم شریکاند. کلاسهای ویژهای که کلاس “مشتق شده ” (Derived Classes) نامیده میشوند، از کلاس مشترک که “کلاس پایه” (Base Class) نامیده میشود ارث میبرند. کلاسDerived را همچنین کلاس تعمیم یافته (Extended) یک کلاس پایه نیز مینامند. کلاس پایه اعمال مشترکی که به هر کلاس مشتق عرضه میشود را کپسوله سازی میکند. برای مثال فرض کنید کلاسی به نام کامیون داریم، کلاس کامیون تمامی اعمال اولیه که یک ماشین نیاز دارد را داراست. متدهایی برای به جلو رفتن، برگشتن و روشن شدن دارد و تمام متدهای لازم برای برای انجام این اعمال را کپسوله میکند. شاید شما یک کلاس مشتق که PickupTruck نام دارد تعریف کنید که از کلاس کامیون ارث میبرد. چون این از کامیون ارث می برد همه اعمال و قابلیتهایی که کامیون تامین میکند را دارد. سپس شما میتوانید قابلیتهای اضافهای را برای کلاس جدید پیاده سازی کنید، مانند خصوصیت “بار”. کلاس PickupTruck میتواند به عنوان یک کلاس پایه برای کلاس مشتق دیگر “کامیون چهار دنده” ایفای نقش کند. چند رفتاری در کلاسهای وارث عموما” کلاسهای وارث یک رابطه “یک … است” با کلاس پایه دارند. یک “کامیون کشاورزی چهاردنده” یک “کامیون کشاورزی” است و یک کامیون “کشاورزی” یک “کامیون” است. هر نمونه از کلاس مشتق میتواند رفتار متفاوتی به عنوان نمونهای از کلاس پایهاش داشته باشد. پس، اگر متدی نیاز به شیئ کامیون داشته باشد شما میتوانید شیئ کامیون کشاورزی را عرضه کنید. هر کلاس مشتق ممکن است به طور ضمنی به کلاس پایه خود تبدیل شود. وقتی یک کلاس به کلاس پایه خودش تبدیل میشود، هر عضوی که به وسیله کلاس مشتق پیاده سازی شده غیر قابل دسترس خواهند شد و تنها اعضای کلاس پایه در دسترس خواند بود. ساختن کلاسهای وارث یک کلاس وارث به وسیله کلمه کلیدی Inherits در VB</acronym>.NET تعریف میشود. در مثال زیر کلاس PickupTruckکه از کلاس Truck ارث برده را تعریف نمودیم: کد: Public Class PickupTruck Inherits Truck ‘ Additional implementation omitted End Class</pre> کلاس ها فقط میتوانند از یک کلاس پایه ارث ببرند اما میتوانند چندین اینترفیس را پیاده سازی کنند. اگر کلاس شما چندین اینترفیس را پیاده سازی کند و همچنین از یک کلاس ارث ببرد، باید از کلمه کلیدی Implements را بلافاصله بعد از کلمه کلیدی Inherits استفاده کنید: کد: Public Class FourWheelDrivePickupTruck Inherits PickupTruck Implements IFourWheelDrive ‘ Additional implementation omitted End Class</pre> وقتی که کلاس وارث تعریف شد، میتوانید اعضای اضافی را پیاده سازی کنید که باعث اضافه شدن اعمال اختیاری به کلاستان میشود. کلاسهای بدون وارث گاهی شاید بخواهید کلاسی درست کنید که نتواند به عنوان کلاس پایه برای دیگر کلاسها عمل کند. به عنوان مثال شاید کلاس خاصی تعریف کنید که از آن در کامپوننتهایتان استفاده میکنید و نمیخواهید قابل استفاده به عنوان کلاس پایه برای دیگر برنامه نویسان باشد. در این موارد میتوانید کلاستان را با NotInheritabel برچسب بزنید. کد: Public NotInheritable Class AClass ‘ Implementation omitted End Class</pre> اعضاء وارث وقتی یک کلاس وارث درست میکنیم، کلاس جدید همه اعمال موجود در کلاس پایه را حفظ میکند. علاوه بر این اعضا جدیدی را اضافه میکند، شما میتوانید اعضای وارث را آن طور که میخواهید پیاده سازی کنید. Overriding اعضای پایه این امکان را به شما میدهد که یک عضو موجود در کلاس پایه را پیاده سازی جدیدی کنید. در VB</acronym>.NET همچنین میتوانید اعضای پایه را سایه بزنید (Shadow). سایه زنی اعضای پایه این امکان را میدهد که عضو پایه را پنهان کنیم و یک عضو جدید با همان نام، اما با خصوصیات کاملا” متفاوت شامل امضاء، و سطح دسترسی جدید اضافه کنیم.
پاسخ : برنامه نویسی شیئ گرا در vb.net Overriding اعضاء کلاس پایه وقتی از یک کلاس پایه ارث میبرید، میتوانید پیاده سازی متفاوتی برای اعضای کلاس پایه بوسیله Override کردن آنها داشته باشید. برای مثال، کلاس Car ممکن است متدی با نام GoForward داشته باشد. اگر کلاس SportCar از کلاس Car به ارث ببرد، شاید بخواهد پیاده سازی متفاوتی از متد GoForward داشته باشد. فقط متدها و خصوصیات کلاس پایه میتوانند Override شوند. متغییرها و رویدادهای اعضاء نمیتوانند Override شوند. با استفاده از کلمه کلیدی Overrides میتوانید پیاده سازی متفاوتی از یک عضو ارایه کنید. پیاده سازی جدید باید امضا و نوع برگشتی یکسانی با عضوی که Override میشود داشته باشد و باید سطح دسترسی مشابهی هم داشته باشد. کد: ‘ This example assumes the existence of a GoForward method in the base class Public Class SportsCar Inherits Car ‘ This line declares the overridden method Public Overrides Sub GoForward(ByVal Speed As Integer) ‘ Implementation omitted End Sub End Class</pre> وقتی که یک عضو Override میشود، عضو جدید “جایگزین عضو کلاس پایه” نامیده میشود. به عنوان مثال، اگر نمونهای از یک کلاس وارث از کلاس پایه خودش ساخته شود و یک متد Override شده فراخوانی شود، پیاده سازی جدید اجرا خواهد شد. برای Override عضو کلاس پایه، اعضا باید با Overridable برچسب زده شوند: کد: Public Overridable Sub OverrideMe() ‘ Implementation omitted End Sub</pre>
پاسخ : برنامه نویسی شیئ گرا در vb.net سایه زنی (Shadowing) اعضای کلاس پایه در بخش قبل آموختید که چطور پیاده سازی عضوی در کلاس پایه را با پیاده سازی متفاوتی از عضو مشابهی، جایگزین کنید. در NET. همچنین امکان پذیر است که پیاده سازی عضو کلاس پایه را پنهان کرد و با عضو کاملا” جدیدی جایگزین کرد، که سطح دسترسی و امضای متفاوتی داشته باشد یا حتی نوع متفاوتی داشته باشد. این کار Shadowing نامیده میشود. در VB</acronym>.NET از کلمه کلیدی Shadows برای جایگزینی پیاده سازی جدید برای عضو کلاس پایه استفاده میکنیم. کد: ‘ This is the base class Public Class MyBaseClass Public Function MyMethod(ByVal I As Integer) As String ‘ Implementation omitted End Function End Class ‘ This class inherits the base class Public Class MyInheritedClass Inherits MyBaseClass ‘ This function shadows the MyMethod sub defined in the base class. ‘ Note that this member has a completely different signature, access ‘ level and returns a different type of value. Friend Shadows Function MyMethod(ByVal S As String) As Integer ‘ Implementation omitted End Function End Class</pre>
پاسخ : برنامه نویسی شیئ گرا در vb.net حفظ سازگاری با اعضای سایه زده شده وقتی عضو کلاسی را سایه میزنید یا پنهان میکنید، پیاده سازی کلاس پایه را پنهان میکنید و پیاده سازی جدیدی میسازید که نیاز به مشخصات مشابه با عضو کلاس پایه ندارد. این میتواند موجب مشکلاتی شود. اگر شیئی تابع MyMethod را از مثال قبل صدا بزند، این انتظار دارد که نوع String برگشت داده شود و وقتی یک Interger از نمونه عضو سایه زده شده برمیگردد، یک خطا ایجاد میشود. بنابراین باید وقتی عضوی را سایه میزنید یا پنهان میکنید دقت زیادی داشته باشید. این باید در مواردی انجام شود که شما یقین دارید که سازگاری از بین نمیرود. کد: ‘ This example uses the MyBaseClass and MyInheritedClass classes ‘ defined in the previous code example. Dim X As New MyInheritedClass() Dim Y As MyBaseClass ‘ X and Y now refer to the same object, but the variables have
پاسخ : برنامه نویسی شیئ گرا در vb.net دسترسی به اعضاء کلاس پایه وقتی اعضاء را Override یا پنهان میسازید، شاید بخواهید به پیاده سازی اعضاء در کلاس پایه دسترسی داشته باشید. بوسیله کلمه کلیدی MyBase میتوانید به اعضای کلاس پایه دسترسی داشته باشید. این کلمه اشارهای به پیاده سازی کلاس پایه دارد و اجازه میدهد که پیاده سازی اعضای کلاس پایه را در اختیار داشته باشید. مثال زیر نشان میدهد که چگونه یک عضو کلاس پایه احضار میشود: کد: ‘ This example demonstrates calling the base class implementation of ‘ MyMethod from within an override of that method Public Overrides Function MyMethod(ByVal I As Integer) As String MyBase.MyMethod(I) ‘ Additional implementation omitted End Function</pre>