به نام پروردگار جهان
آموزش مقدماتی تا پیشرفته سی شارپ بخش صد و سی و یکم
سلام به همه کاربران وبسایت لندلرن
قسمت صد و صد و سی و یکم
كلاسهاي Abstract:
همانطور كه مي دانيد تمام كنترل هايي كه در برنامه هاي خود از آنها استفاده مي كنيد در حقيقت يك شيئ از كلاسي مربوط بـه آن كنترل هستند .
براي مثال هنگامي كه يك كنترل Button روي فرم برنامه قرار مي دهيد، در حقيقت يك شيئ از كلاسي به نام Button ايجاد كرده ايد و در طي برنامه نيز با آن شيئ كار مي كنيد .
فرض كنيد بخواهيد كلاس مربوط به چنين كنترل هايي را در برنامه بنويسيد .
براي اين كار ابتدا بايد يك كلاس پايه، براي مثال بـه نام Window ايجاد كرده و تمام خاصيت ها و متدهاي مشترك بين كنترل ها را در اين كلاس قرار دهيـد .
سـپ س تمـام كنتـرل هايي كه مي خواهيد ايجاد كنيد را، مانند كنترل Button و يا كنترل TextBox ،از اين كلاس به ارث ببريد.
در اين حالـت مسلماً نمي خواهيد بعدها كسي بتواند شيئ را از كلاس Window نمونه سازي كند و از آن شيئ در برنامه استفاده كند، چون ايـن
امر بي معني است كلاس Window نشان دهنده هيچ كنترل خاصي نيست، بلكه فقط به عنوان يـك كـلاس پايـه بـراي تمـام كنترل ها به كار مي رود .
بنـابراين ايـن كـلاس را بـه عنـوان يـك كـلاس abstract مـشخص مـي كنيـد .
كـلاس هـاي abstract به بيان ساده تر كلاس هايي هستند كه نمي توان هيچ شيئ را از آنها نمونه سازي كـرد و حتمـاً بايـد بـه عنـوان كلاس هاي پايه براي ديگر كلاسها مورد استفاده قرار گيرند .
حـال تـصور كنيـد كـه مـي خواهيـد تمـام كنتـرل هـايي كـه از كـلاس Window مـشتق مـي شـوند داراي متـدي بـه نـام DrawWindow باشند كه آن كنترل را در صفحه رسم كند .
براي اين كار بايد متدي به نـام DrawWindow در كـلاس Window ايجاد كنيد .
اما نحوه رسم هر كنترل به نوع آن بستگي دارد و هيچ نقطه ي اشتراكي در اين مورد بين كنترل ها وجـود ندارد كه بخواهيد آن را در بدنه ي اين متد قرار دهيد .
به عبارت ديگر اين متد نمي تواند شامل هيچ كدي باشد .
همچنين مي خواهيد هر كنترلي كه با مشتق شدن از كلاس Window ايجاد مي شود، حتماً اين متد را در خود override كند تا به اين وسـيله
نحوه ي رسم آن كنترل در صفحه مشخص شود .
براي اين كار مي توانيد آن متد را از نوع abstract مشخص كنيد.
بـه ايـن ترتيب هر كلاسي كه از كلاس Window به عنوان كلا س پايه استفاده كند موظف است كه تمام اعـضاي abstract آن كلاس را در خود override كند .
البته دقت داشته باشـيد كـه يـك عـضو abstract فقـط مـي توانـد در كلاسـهاي abstract ايجاد شود.
به عبارت ديگر نمي توانيد در يك كلاس عادي، يك عضو abstract ايجاد كنيد .
در بخش امتحان كنيد بعد سعي مي كنيم مثالي كه در بالا عنوان شد را به گونه اي ساده پياده سازي كنيم .
امتحان كنيد: كلاسهاي Abstract
- یک برنامه کنسولی به نام Abstract demo ایجاد کنید.
- با استفاده از پنجره ي Solution Explorer يك كلاس جديد به نام Window به برنامه اضافه كنيد.
- تعريف كلاس Window را به صورت زير تغيير دهيد:
1 2 3 4 5 6 |
namespace Abstract_Demo { abstract public class Window { |
- كد مشخص شده در زير را به كـلاس Window اضـافه كنيـد .
- دقـت كنيـد متـدي كـه در ايـن كـلاس بـه صـورت abstract تعريف شده است نبايد حاوي كد باشد.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 |
abstract public class Window { public int Left; public int Top; // Constructor method to set // the initial value of fields public Window() { this.Top = 0; this.Left = 0; } // simulates drawing the window // notice: no implementation abstract public void DrawWindow(); } |
اين كلاس از كلاس Window مشتق مي شود و به صورت فرضي يـك ليـست بـاكس را در صفحه نمايش مي دهد .
در مورد تداخل نام اين كلاس با كلاس ListBox در ويژوال استوديو نگـران نباشـيد، زيـرا كلاس ListBox كه در اين قسمت تعريف مي كنيد در فضاي نام Abstract_Demo است ولـي كـلاس ListBox ويژوال استوديو در فضاي نام System.Windows.Forms است.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 |
// ListBox derives from Window public class ListBox : Window { private string listBoxContents; // new member variable // constructor adds a parameter public ListBox(int top,int left,string contents) { Top = top; Left = left; listBoxContents = contents; } // an overridden version implementing the // abstract method public override void DrawWindow() { Console.WriteLine("Writing string to the" + " listbox: " + listBoxContents); } } |
- حال مي خواهيم كنترل ديگري نيز مانند يك كنترل Button ،با استفاده از كلاس Window ايجاد كنـيم .
- بـراي اين كار كلاس ديگري را بعد از كلاس ListBox در فضاي نام Abstract_Demo به صورت زيـر ايجـاد كنيد:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 |
// Button control that derives from Window class public class Button : Window { // The new class's constructor public Button(int top, int left) { Top = top; Left = left; } // implement the abstract method public override void DrawWindow() { Console.WriteLine("Drawing a button at " + Top + ", " + Left); } } |
- ايجاد كلاسهاي مورد نياز براي برنامه به پايان رسيد و حالا بايد نحوه عملكرد آنها را بررسي كنـيم .
- ويرايـشگر كـد بـرايفايل Program.cs را باز كرده و كد زير را در متد Main وارد كنيد.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 |
static void Main(string[] args) { // Create two list boxes and one button ListBox lstBox1 = new ListBox(1, 2, "First List Box"); ListBox lstBox2 = new ListBox(3, 4,"Second List Box"); Button newButton = new Button(5, 6); // Draw all objects on the form lstBox1.DrawWindow(); lstBox2.DrawWindow(); newButton.DrawWindow(); Console.ReadLine(); } |
- حال برنامه را اجرا کنید و نتیجه را مشاهده کنید.
- چگونگی کارکرد این نمونه برنامه را در قسمت صد و سی و دوم دنبال کنید.
c#آموزش 0 تا 100 C#آموزش C Sharpآموزش C#آموزش سی شارپآموزش صفر تا صد C sharpآموزش صفر تا صد سی شارپآموزش مقدماتی تا پیشفرفته سی شارپسی شارپ
دیدگاه بگذارید