درس هشتم – ارث‌بری کلاس‌ها

درس هشتم – ارث‌بری کلاس‌ها

 

در این درس درباره ارث‌بری در زبان برنامه‌نویسی C# صحبت خواهیم کرد. اهداف این درس بشرح زیر می‌باشند :

ü      پیاده‌سازی کلاسهای پایه (Base Class)

ü      پیاده‌سازی کلاسهای مشتق شده (Derived Class)

ü      مقدار دهی کلاس پایه از طریق کلاس مشتق شده

ü      فراخوانی اعضای کلاس پایه

ü      پنهان‌سازی اعضای کلاس پایه

 

ارث‌بری یکی از مفاهیم اساسی و پایه شی‌گرایی است. با استفاده از این ویژگی امکان استفاده مجدد از کد موجود فراهم می‌شود. بوسیله استفاده موثر از این ویژگی کار برنامه‌نویسی آسان‌تر می‌گردد.

 

ارث‌بری(Inheritance)

using System;

 

public class ParentClass

{

public ParentClass()

{

Console.WriteLine("Parent Constructor.");

}

public void print()

{

Console.WriteLine("I'm a Parent Class.");

}

}

public class ChildClass : ParentClass

{

public ChildClass()

{

Console.WriteLine("Child Constructor.");

}

public static void Main()

{

ChildClass child = new ChildClass();

child.print();

}

}

خروجی این برنامه بصورت زیر است :

Parent Constructor.

Child Constructor.

I'm a Parent Class.

در مثال 1-8 دو کلاس وجود دارد. کلاس بالای ParentClass و کلاس پائینی ChildClass است.  کاری که میخواهیم در اینجا انجام دهیم اینست که زیر کلاسی ایجاد کنیم که با استفاده از کدهای موجود در ParentClass عمل نماید.

 

برای این منظور ابتدا باید در اعلان ChildClass مشخص کنیم که این کلاس می‌خواهد از کلاس ParentClass ارث‌بری داشته باشد. این عمل با اعلان public class ChildClass : ParentClass روی می‌دهد. کلاس پایه با قرار دادن ":" بعد از نام کلاس مشتق شده معین می‌شود.

 

C# فقط از ارث‌بری یگانه پشتیبانی می‌نماید. از اینرو تنها یک کلاس پایه برای ارث‌بری می‌توان معین نمود. البته باید اشاره کرد که ارث‌بری چندگانه تنها از واسطها (Interfaces) امکان‌پذیر است که در درسهای آینده به آنها اشاره می‌نماییم.

 

ChildClass دقیقاً توانائیهای ParentClass را دارد. از اینرو می‌توان گفت ChildClass یک ParentClass است. (ChildClass IS a ParentClass) ChildClass دارای متد Print() مربوط به خود نیست و از متد کلاس ParentClass استفاده می‌کند. نتیجه این عمل در خط سوم خروجی دیده می‌شود.

 

کلاسهای پایه به طور خودکار، قبل از کلاس‌های مشتق شده نمونه‌ای از روی آنها ایجاد می‌گردد. به خروجی مثال 1-8 توجه نمایید. سازنده ParentClass قبل از سازنده ChildClass اجرا می‌گردد.

 

برقراری ارتباط کلاس مشتق شده با کلاس پایه

به مثال 2-8 که در زیر آمده است توجه نمایید.

using System;

 

public class Parent

{

string parentString;

public Parent()

{

Console.WriteLine("Parent Constructor.");

}

public Parent(string myString)

{

parentString = myString;

Console.WriteLine(parentString);

}

public void print()

{

Console.WriteLine("I'm a Parent Class.");

}

}

public class Child : Parent

{

public Child() : base("From Derived")

{

Console.WriteLine("Child Constructor.");

}

public new void print()

{

base.print();

Console.WriteLine("I'm a Child Class.");

}

public static void Main()

{

Child child = new Child();

child.print();

((Parent)child).print();

}

}

خروجی این برنامه بشکل زیر است :

From Derived

Child Constructor.

I'm a Parent Class.

I'm a Child Class.

I'm a Parent Class.

کلاسهای مشتق شده در طول ایجاد نمونه می‌توانند با کلاس پایه خود ارتباط برقرار نمایند. در مثال 2-8 چگونگی انجام این عمل را در سازنده ChildClass نشان می‌دهد. استفاده از " : " و کلمه کلیدی base باعث فراخوانی سازنده کلاس پایه به همراه لیست پارامترهایش می‌شود. اولین سطر خروجی،  فراخوانی سازنده کلاس پایه را بهمراه رشته "From Derived" نشان می‌دهد.

 

ممکن است حالتی رخ دهد که نیاز داشته باشید تا متد موجود در کلاس پایه را خود پیاده‌سازی نمایید. کلاس Child این عمل را با اعلان متد Print() مربوط به خود انجام می‌دهد. متد Print() مربوط به کلاس Child، متد Print() کلاس Parent را پنهان می‌کند. نتیجه این کار آنست که متد Print() کلاس Parent() تا زمانیکه عمل خاصی انجام ندهیم قابل فراخوانی نمی‌باشد.

 

درون متد Print() کلاس Child، صریحاً متد Print() کلاس Parent را فراخوانی کرده‌ایم. این عمل با استفاده از کلمه کلیدی base قبل از نام متد انجام گرفته است. با استفاده از کلمه کلیدی base می‌توان به هر یک از اعضای public و protected کلاس پایه دسترسی داشت. خروجی مربوط به متد Print() کلاس Child در سطرها سوم و چهارم خروجی دیده می‌شوند.

 

روش دیگر دسترسی به اعضای کلاش پایه، استفاده از Casting صریح است. این عمل در آخرین سطر از متد Main() کلاس Child رخ داده است. توجه داشته باشید که کلاس مشتق شده نوع خاصی از کلاس پایه‌اش می‌باشد. این مسئله باعث می‌شود تا بتوان کلاس مشتق شده را مورد عمل Casting قرار داد و آنرا نمونه‌ای از کلاس پایه‌اش قرار داد. آخرین خط خروجی نشان می‌دهد که متد Print() کلاس Parent اجرا شده است.

 

به وجود کلمه کلیدی new در متد Print() کلاس Child توجه نمایید. این عمل باعث می‌شود تا متد Print() کلاس Child متد Print() کلاس پایه‌اش را پنهان نماید. درصورتیکه از کلمه کلیدی new استفاده نشود، کامپایلر پیغام اخطاری را توالید می‌کند تا توجه شما را به این مسئله جلب کند. توضیحات بیشتر در این زمینه مربوط به مبحث چندریختی (Polymorphism) است که در درس آینده آنرا بررسی خواهیم نمود.

 

خلاصه

در این درس با روش ایجاد کلاس پایه و کلاس مشتق شده از آن آشنا شدید. متدهای کلای پایه را می‌توانید بصورت صریح و یا ضمنی فراخوانی کنید. همچنین متوجه شدید که کلاس مشتق شده نوع خاصی از کلاس پایه است.

درس هفتم – آشنایی با کلاسها در C#

درس هفتم – آشنایی با کلاسها در C#

 

در این درس با کلاسها در زبان C# آشنا خواهید شد. اهداف این درس به شرح زیر می‌باشند :

ü      پیاده‌سازی سازنده‌ها (Constructors)

ü      درک تفاوت بین اعضای نمونه (Instance) و استاتیک (Static)

ü      آشنایی با تخریب کننده‌ها (Destructors)

ü      آشنایی با اعضای کلاسها

 

در تمامی مطالبی که در این سایت مشاهده کرده‌اید، برنامه‌ها دارای کلاس‌هایی بوده‌اند. در حال حاضر باید درک نسبی از کلاسها و کار آنها و چگونگی ایجاد آنها داشته باشید. در این درس مروری بر آموخته‌های قبلی از کلاسها خواهیم کرد و نیز با اعضای کلاسها آشنا می‌شویم.

 

یک کلاس با استفاده از کلمه کلیدی class که بدنبال آن نام کلاس آمده باشد، اعلان می‌گردد و اعضای این کلاس درون {} اعلان می‌گردند. هر کلاس دارای سازنده‌ای می‌باشد که در هربار ایجاد نمونه‌ای جدید از آن کلاس، بصورت خودکار فراخوانی می‌گردد. هدف از سازنده، تخصیص‌دهی اعضای کلاس در زمان ایجاد نمونه‌ای جدید از کلاس است. سازنده‌ها دارای مقادیر بازگشتی نبوده و همواره نامی مشابه نام کلاس دارند. مثال 1-7 نمونه‌ای از یک کلاس را نشان می‌دهد.

// Namespace اعلان

using System;

 

class OutputClass

{

string myString;

// سازنده

public OutputClass(string inputString)

{

myString = inputString;

}

 // متد نمونه

public void printString()

{

Console.WriteLine("{0}", myString);

}

// تخریب کننده

~OutputClass()

{

// روتینی جهت آزادسازی برخی از منابع سیستم

}

}

// کلاس آغازین برنامه

class ExampleClass

{

// آغاز اجرای برنامه

public static void Main()

{

// OutputClass نمونه‌ای از

OutputClass outCl = new OutputClass("This is printed by the output class.");

 // Output فراخوانی متد کلاس

outCl.printString();

}

}

در مثال 1-7 دو کلاس دیده می‌شوند. کلاس بالایی، کلاس OutPutClass، دارای سازنده، متد نمونه و یک تخریب کننده است. همچنین این کلاس دارای فیلدی با نام myString است. توجه نمایید که چگونه سازنده این کلاس اعضای آنرا تخصیص‌دهی(مقداردهی) می‌نماید. در این مثال، سازنده کلاس رشته‌ ورودی (inputString) را بعنوان آرگومان خود دریافت می‌نماید. سپس این مقدار داخل فیلد کلاس یعنی myString کپی می‌گردد.

 

همانطور که در ExampleClass مشاهده می‌نمایید، استفاده از سازنده الزامی نمی‌باشد. در این مورد سازنده پیش فرض ایجاد می‌گردد. سازنده پیش فرض، سازنده‌ای بدون هیچ نوع آرگومانی است. البته شایان ذکر است که سازنده‌هاییی بدون آرگومان همیشه مورد استفاده نبوده و مفید نیستند. جهت کارآمد کردن بیشتر سازنده‌های بدون آرگومان بهتر است آنها را با تخصیص‌دهنده (Initializers) پیاده‌سازی نمایید. به مثال زیر در این زمینه توجه نمایید :

public OutputClass() : this("Default Constructor String") { }

فرض کنید این عبارت در کلاس OutPutClass در مثال 1-7 قرار داشت. این سازنده پیش فرض به یک تخصیص‌دهنده همراه شده است. ":" ابتدای تخصیص‌دهنده را مشخص ‌می‌نما‌ید، و به دنبال آن کلمه کلیدی this آمده است. کلمه کلیدی this به شیء کنونی اشاره می‌نماید. استفاده از این کلمه، فراخوانی به سازنده شیء کنونی که در آن تعریف شده است، ایجاد می‌کند. بعد از کلمه کلیدی this لیست پارامترها قرار می‌گیرد که در اینجا یک رشته است. عملی که تخصیص‌دهنده فوق انجام می‌دهد، باعث می‌شود تا سازنده OutPutClass رشته‌ای را بعنوان آرگومان دریافت نماید. استفاده از تخصیص‌دهنده‌ها تضمین می‌نمایند که فیلدهای کلاس شما در هنگام ایجاد نمونه‌ای جدید مقدار‌دهی می‌شوند.

 

مثال فوق نشان داد که چگونه یک کلاس می‌تواند سازنده‌های متفاوتی داشته باشد. سازنده‌ای که فراخوانی می‌شود، به تعداد و نوع آرگومانهایش وابسته است.

 

در زبان C#، اعضای کلاسها دو نوع می‌باشند : اعضای نمونه و استاتیک.  اعضای نمونه کلاس متعلق به رخداد خاصی از کلاس هستند. هربار که شی‌ای از کلاسی خاص ایجاد می‌کنید، در حقیقت نمونه‌ جدیدی از آن کلاس ایجاد کرده‌اید. متد Main() در کلاس ExampleClass نمونه جدیدی از OutPutClass را تحت نام outCl ایجاد می‌نماید. می‌توان نمونه‌های متفاوتی از کلاس OutPutClass را با نامهای مختلف ایجاد نمود. هر یک از این نمونه‌های مجزا بوده و به تنهایی عمل می‌کنند. به عنوان مثال اگر دو نمونه از کلاس OutPutClass همانند زیر ایجاد نمایید :

OutputClass oc1 = new OutputClass("OutputClass1");

OutputClass oc2 = new OutputClass("OutputClass2");

با این اعلان، شما دو نمونه از کلاس OutPutClass را ایجاد کرده‌اید که یک از آنها دارای فیلد myString و متد printString() هستند و این فیلدها و متدها کاملاً از یکدیگر مجزا می‌باشند. به بیان دیگر درصورتیکه عضوی از کلاس استاتیک باشد از طریق ساختار نوشتاری . قابل دسترس خواهد بود. در این مثال نمونه‌ها oc1 و oc2 هستند. فرض کنید کلاس OutPutClass دارای متد استاتیک زیر باشد :

public static void staticPrinter()

{

  Console.WriteLine("There is only one of me.");

}

این متد را از درون متد Main() به صورت زیر می‌توانید فراخوانی نمایید :

OutputClass.staticPrinter();

اعضای استاتیک یک کلاس تنها از طریق نام آن کلاس قابل دسترس می‌باشند و نه از طریق نام نمونه ایجاد شده از روی کلاس. بدین ترتیب برای فراخوانی اعضای استاتیک یک کلاس نیازی به ایجاد نمونه از روی آن کلاس نمی‌باشد. همچنین تنها یک کپی از عضو استاتیک کلاس، در طول برنامه موجود می‌باشد. یک مورد استفاده مناسب از اعضای استاتیک در مواردی است که تنها یک عمل باید انجام گیرد و در انجام این عمل هیچ حالت میانی وجود نداشته باشد، مانند محاسبات ریاضی. در حقیقت، .Net Framework BCL خود دارای کلاس Math می‌باشد که از اعضای استاتیک بهره می‌برد.

 

نوع دیگر سازنده‌ها، سازنده‌های استاتیک هستند. از سازنده‌های استاتیک جهت مقدار‌دهی فیلدهای استاتیک یک کلاس استفاده می‌شود. برای اعلان یک سازنده استاتیک تنها کافیست که از کلمه کلیدی static در جلوی نام سازنده استفاده نمایید. سازنده استاتیک قبل از ایجاد نمونه جدیدی از کلاس، قبل از فراخوانی عضو استاتیک و قبل از فراخوانی سازنده استاتیک کلاس مشتق شده، فراخوانی می‌گردد. این سازنده‌ها تنها یکبار فراخوانی می‌شوند.

 

OutPutClass همچنین دارای یک تخریب‌کننده (Destructor) است. تخریب‌کننده‌ها شبیه به سازنده‌ها هستند، با این تفاوت که در جلوی خود علامت "~" را دارا می‌باشند. هیچ پارامتری دریافت نکرده و هیچ مقداری باز نمی‌گردانند. از تخریب‌کننده‌ها می‌توان در هر نقطه از برنامه که نیاز به آزادسازی منابع سیستم که در اختیار کلاس یا برنامه است، استفاده نمود. تخریب‌کننده‌ها معمولاً زمانی فراخوانی می‌شوند که Garbage Collector زبان C# تصمیم به حذف شیء مورد استفاده برنامه از حافظه و آزادسازی منابع سیستم، گرفته باشد. (Garbage Collector یا GC، یکی از امکانات .Net Framework مخصوص زبان C# است که سیستم بصورت اتوماتیک اقدام به آزادسازی حافظه و باز گرداندن منابع بلا استفاده به سیستم می‌نماید. فراخوانی GC بصورت خودکار رخ می‌دهد مگر برنامه‌نویس بصورت صریح از طریق تخریب‌کننده‌ها آنرا فراخوانی نماید. در مباحث پیشرفته‌تری که در آینده مطرح می‌کنیم خواهید دید که در چه مواقعی نیاز به فراخوانی تخریب‌کننده‌ها بصورت شخصی دارید.)

 

تا کنون، تنها اعضای کلاس که با آنها سر و کار داشته‌اید، متدها، فیلدها، سازنده‌ها و تخریب‌کننده‌ها بوده‌اند در زیر لیست کاملی از انواعی را که می‌توانید در کلاس از آنها استفاده نمایید آورده شده است :

• Constructors

• Destructors

• Fields

• Methods

• Properties

• Indexers

• Delegates

• Events

• Nested Classes

مواردی که در این درس با آنها آشنا نشدید، حتماً در درس‌های آینده مورد بررسی قرار خواهند گرفت.

 

خلاصه

در این درس نحوه اعلان سازنده‌های استاتیک و نمونه را فرا گرفتید و با نحوه مقداردهی به فیلدها آشنا شدید. زمانیکه نیاز به ایجاد نمونه از روی شیء نباشد از اعضای استاتیک کلاس استفاده می‌کنیم. با استفاده از تخریب‌کننده‌ها می‌توانید منابع بلا استفاده را به سیستم باز گردانید.

درس ششم – Namespaces

 درس ششمNamespaces

 اهداف این درس به شرح زیر می‌باشد :

ü      آشنایی با Namespace در زبان C#

ü      چگونگی استفاده از هدایتگر using (using directive)

ü      چگونگی استفاده از هدایتگر alias (alias directive)

ü      اعضای یک Namespace چه هستند؟

 اگر به خاطر داشته باشید، در درس اول، در ابتدای برنامه از using System;  استفاده نمودیم. با استفاده از این کد، امکان دسترسی ما به اعضای Namespace مورد نظر، که در اینجه System است، فراهم می‌شد. پس از مطالعه این درس، مطالب بسیاری درباره هدایتگر  using فرا خواهید گرفت.

 Namespace ها، المان‌های زبان C# هستند که شما را در سازماندهی کردن برنامه، کمک می‌کنند. پیاده‌سازی Namespace ها در کد برنامه بسیار مفید است چراکه از ایجاد مشکلات مربوط به استفاده مجدد کد، پیشگیری می‌نماید.

 چگونگی ایجاد Namespace

به مثال زیر توجه نمایید.

// Namespace اعلان

using System;

 

// C# Persian Namespace

namespace csharp-persian

{

// کلاس آغازین برنامه

class NamespaceCSS

{

// آغاز اجرای برنامه

public static void Main()

{

// چاپ خروجی در کنسول

Console.WriteLine("This is the new C# Persian Namespace.");

}

}

}

مثال 1-6 چگونگی ایجاد یک Namespace را نشان می‌دهد. در این مثال ما با قرار دادن کلمه کلیدی namespace در جلوی csharp-persian یک Namespace جدید ایجاد نمودیم. مثال 2-6، Namespace های تودرتو را نشان می‌دهد.

// Namespace اعلان

using System;

 

// C# Persian Namespace

namespace csharp-persian

{

namespace tutorial

{

// کلاس آغازین برنامه

class NamespaceCSS

{

// آغاز اجرای برنامه

public static void Main()

{

 // چاپ خروجی در کنسول

Console.WriteLine("This is the new C# Persian Namespace.");

}

}

}

}

 

Namespace ها این امکان را فراهم می‌آورند تا سیستمی جهت سازماندهی کدهای خود ایجاد نمایید. یک روش مناسب جهت سازماندهی Namespace های برنامه، استفاده از یک سیستم سلسله مراتبی است. بدین ترتیب که Namespace های عمومی را در بالای این ساختار قرار داده و هر چه در این ساختار پاین‌تر می‌آییم، Namespace های تخصصی‌تر قرار می‌گیرند. این سیستم سلسله مراتبی بوسیله Namespace های تودرتو قابل پیاده‌سازی هستند. این پیاده‌سازی در مثال 2-6 نشان داده شده است. با قرار دادند کدهای خود در Namespace های فرعی می‌توانید کدهای خود را سازماندهی نمایید.

// Namespace اعلان

using System;

 

// C# Persian Tutorial Namespace

namespace csharp-persian.tutorial

{

 // کلاس آغازین برنامه

class NamespaceCSS

{

 //آغاز اجرای برنامه

public static void Main()

{

 // چاپ خروجی در کنسول

Console.WriteLine("This is the new C# Persian Namespace.");

}

}

}

مثال 3-6 روش دیگر ایجاد Namespace های تودرتو را نشان می‌دهد. همانطور که در این مثال مشاهده می‌نمایید، Namespace تودرتو با قرار دادن عملگر نقطه "." در بین csharp-persian و tutorial ایجاد شده است. این مثال از نظر کارآیی دقیقاً همانند مثال 2-6 است و از نظر پیاده‌سازی آسان‌تر از آن می‌باشد.

 فراخوانی اعضای یک Namespace

// Namespace اعلان

using System;

 

namespace csharp-persian

{

// namespace تودرتو

namespace tutorial

{

class myExample1

{

public static void myPrint1()

{

Console.WriteLine("First Example of calling another namespace member.");

}

}

}

 // کلاس آغازین برنامه

class NamespaceCalling

{

 // آغاز اجرای برنامه

public static void Main()

{

 // چاپ خروجی در کنسول

tutorial.myExample1.myPrint1();

tutorial.myExample2.myPrint2();

}

}

}

 

//تودرتو بالا Namespaceمشابه  Namespace  

namespace csharp-persian.tutorial

{

class myExample2

{

public static void myPrint2()

{

Console.WriteLine("Second Example of calling another namespace member.");

}

}

}

 

مثال 4-6 چگونگی فراخوانی اعضای Namespace نشان می‌دهد. در ابتدای مثال 4-6، یک Namespace تودرتو اعلان شده است، tutorial درون csharp-persian، که دارای کلاس myExample1 و متد myPrint1 می‌باشد. متد Main() این متد را با نام tutorial.myExample1.myPrint1 فراخوانی می‌نماید. چون متد Main() و tutorial درون یک Namespace قرار دارند، دیگر نیازی به استفاده از نام csharp-persian غیر ضروری است.

 در انتهای مثال 4-6، یک Namespace دیگر بصورت csharp-persian.tutorial آورده شده است. کلاسهای myExamlpe1 و myExample2 هر دو متعلق به یک Namespace می‌باشند، هرچند می‌تواند آنها را مجزا از یکدیگر نوشت در حالیکه متعلق به یک Namespace باشند. درون متد Main()، متد myPrint2 بصورت tutorial.myExample2.myPrint2 فراخوانی شده است. هرچند کلاس myExample2 خارج از محدوده‌ایست که متد myPrint2 فراخوانی شده است، نیازی به آمردن نام csharp-persian برای این فراخوانی وجود ندارد، زیرا هر دو کلاس متعلق به یک Namespace، یعنی csharp-persian هستند.

 توجه نمایید که برای هر یک از کلاسهای myExample1 و myExample2 نامهای متفاوتی انتخاب شده است، زیرا هر عضو متعلق به یک Namespace باید دارای نام یکتایی باشد. برای متدهای myPrint1 و myPrint2 ، بعلت سادگی در امر یادگیری این مطلب، نامهای متفاوتی در نظر گرفته شده است. توجه نمایید که این دو متد بعلت اینکه در کلاسهای متفاوتی قرار دارند، می‌توان نامهای یکسانی برایشان انتخاب نمود، و در اینصورت هیچگونه تداخلی بین ایندو ایجاد نخواهد شد.

 استفاده از هدایتگر using

// Namespace اعلان

using System;

using csharp_station.tutorial;

 

// کلاس آغازین برنامه

class UsingDirective

{

 // آغاز اجرای برنامه

public static void Main()

{

 // Namespace فراخوانی عضوی از

myExample.myPrint();

}

}

// C# PersianTutorial Namespace

namespace csharp-persian.tutorial

{

class myExample

{

public static void myPrint()

{

Console.WriteLine("Example of using a using directive.");

}

}

}

 

در صورتیکه می خواهید متدهایی را بدون استفاده از نام کامل آنها،‌به همراه نام Namespace، استفاده نمایید، می‌توانید از هدایتگر using استفاده نمایید. در مثال 5-6، دوبار از هدایتگر using استفاده شده است. اولین استفاده از این هدایتگر، using System،‌ دقیقاً مشابه به همان چیزی است کع تا کنون در این درسها مشاهده نموده‌اید. با استفاده از این هدایتگر می‌توانید از اعضای موجود در System، بدون اینکه نیاز به تایپ کلمه System در هربار داشته باشید، استفاده نمایید. در myPrint()، کلاس Console عضوی از System است که دارای متد WriteLine() می‌باشد. اگر در ابتدای برنامه از هدایتگر using استفاده نکنیم، باید برای هر دفعه استفاده از متد WriteLine()، نام کامل آن یعنی System.Console.WriteLine() را تایپ نماییم.

 به طور مشابه، استفاده از using csharp-persian.tutorial امکان استفاده از اعضای این Namespace را، بدون نیاز به تایپ نام کامل آنها فراهم می‌نماید. چون در ابتدای برنامه از هدایتگر using استفاده نموده‌ایم، در متن برنامه متد myPrint() را بصورت myExample.myPrint() استفاده نموده‌ایم، درصورتیکه از هدایتگر using استفاده نمی‌گردیم برای استفاده از این متد باید آنرا بصورت csharp-persian.tutorial.myExample.myPrint() می‌آوردیم.

 استفاده از هدایتگر Alias

// Namespace اعلان

using System;

using csTut = csharp-persian.tutorial.myExample; // alias

 

// کلاس آغازین برنامه

class AliasDirective

{

 // آغاز اجرای برنامه

public static void Main()

{

 // Namespace فراخوانی عضوی از

csTut.myPrint();

myPrint();

}

 // متدی که ممکن است تولید ابهام نماید.

static void myPrint()

{

Console.WriteLine("Not a member of csharp-persian.tutorial.myExample.");

}

}

// C# Persian Tutorial Namespace

namespace csharp-persian.tutorial

{

class myExample

{

public static void myPrint()

{

Console.WriteLine("This is a member of csharp-persian.tutorial.myExample.");

}

}

}

در برخی موارد ممکن است با Namespace خاصی روبرو شوید که دارای نامی طولانی است و تمایل داشته باشید تا نام آنرا کوتاهتر نمایید. این کار با استفاده از ایجاد استعاره (Alias) امکان‌پذیر است. همانطور که در مثال 6-6 ملاحظه می‌نمایید، با استفاده از

 csTut = csharp-persian.tutorial.myExample یک استعاره تولید کرده‌ایم و در متن برنامه به جای استفاده از نام طولانی csharp-persian.tutorial.myExample از نام مستعار آن یعنی csTut استفاده نموده‌ایم. حال از این نام مستعار در هر جای برنامه می‌توان استفاده کرد. ما در این برنامه در متد Main() استفاده نموده‌ایم.

 همچنین در متد Main()، فراخوانی از متد myPrint() مربوط به کلاس AliasDirective صورت گرفته است. نام این متد همانند myPrint() موجود در myExample است. علت اینکه می‌توان هر دو این متدها را همزمان فراخوانی کرد، استفاده از هدایتگر alias برای متد myPrint() مربوط به کلاس myExample است. (csTut.myPrint()) استفاده از این روش باعث می‌شود تا کامپایلر دریابد که کدام متد را باید اجرا نماید. در صورتیکه به اشتباه از هدایتگر alias (csTut.myPrint()) استفاده نکنیم، کامپایلر به اشتباه متد myPrint() مربوط به کلاس AliasDirective را دوبار اجرا خواهد کرد.

 تا اینجا،‌ما تنها کلاسها را در Namespace ها نشان دادیم. Namespace ها انواع دیگری را نیز می‌توانند در خود داشته باشند که در زیر مشاهده می‌نمایید :

Classes

Structures

Interfaces

Enumerations

Delegates

خلاصه

در این درس با Namespace آشنا شدید و فراگرفتید که چگونه Namespace خود را اعلان نمایید. اگر نخواهید در هربار استفاده از متدها یا اعضای یک Namespace، نام کامل آنها را استفاده کنید، باید از هدایتگر using استفاده نمایید. در صورتیکه بخواهید بجای استفاده از نام طولانی یک Namespace، از نامی ک.وتاهتر استفاده کنید، باید از هدایتگر استعاره‌ای (Alias Directive) استفاده نمایید