برنامه‌ نویسی شی‌گرا در#C چیست؟

پنجشنبه 21 مرداد 1395

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

برنامه‌ نویسی شی‌گرا در#C چیست؟

محورهای برنامه‌نویسی شی‌گرا :

مطابق دست‌آوردهای اخیر موسسه‌ی تحقیقاتی S.E.I، در برنامه‌نویسی شی‌گرا پنج محور اصلی وجود دارد. abstract که آخرین محور آن محسوب می‌گردد در سال 1386 اضافه‌شد.

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

کلاس (Class)

شی (Object)

وراثت (Inheritance)

چندریختی (Polymorphism)

Abstraction

کلاس‌ها:

کلاس‌ها نخستین محور یک زبان برنامه‌نویسی شی‌گرا هستند وبرای ساخت یک نمونه (Instance) یا شی (object) به‌کار می‌روند. کلاس، درواقع قالبی است که برای ساخت نمونه‌ها و شی‌ها ضرویست. اگر کلاس به‌صورت استاتیک اعلان نشده‌باشد، کدنویس قادر خواهدبود از کلاس برای ساخت شی‌ها و متدها استفاده نماید. چهار نوع کلاس وجود دارد که این‌جا شرح داده می‌شوند:

کلاس‌های استاتیک (Static Classes)

کلاس‌های Abstract Classes

کلاس‌های مهر و موم‌شده (Sealed Classes)

کلاس‌های جزئی (Partial Classes)

در ادامه روالی (procedure) آمده که چگونگی ساخت یک کلاس ساده را نشان می‌دهد. این بهتر از خواندن مراحل ساخت کلاس کمکتان می‌کند!

مراحل ساخت کلاس:

1- ابتدا راست‌کلیک کنید تا گزینه‌ها نمایان شوند.

2- سپس روی گزینه‌ی add کلیک نمایید.

3-بعداز آن روی گزینه‌ی class کلیک کنید.

4- نام کلاس را با پسوند cs انتخاب کنید.

شکل 1 از مراحل ساخت کلاس

شکل1: گزینه‌ی add را انتخاب کنید.

شکل 2 ازمراحل ساخت کلاس

شکل2: روی گزینه‌ی class کلیک نمایید.

شکل 3 از مراحل ساخت کلاس

شکل3: نمایش کد

انواع کلاس‌ها

کلاس‌های استاتیک

کلاس‌های استاتیک کلاس‌هایی هستند که فاقد شیء بوده و بدون شیء کار می‌کنند. همچنین آن‌ها به‌عنوان الگوی کلاس شناخته می‌شوند. ما به‌جای ساختن یک شی، می‌توانیم به‌طور مستقیم متدهای استاتیک را فراخوانی کنیم. نکته اینجاست که ایجاد انواع متد (غیراستاتیک واستاتیک) در کلاس‌های استاتیک مشابه ایجاد متد استاتیک در کلاس غیراستاتیک است.

مثال:

static class Calculation
{
   // static methods
   public static long GetProduct(int x, int y)
   {
      return x * y;
   }
 
}
 
class Program
{
   static void Main(string[] args)
   {
      Calculation.GetProduct(12, 33);
      // static method call
   }
}

 کلاس abstract

کلاس‌های abstract کلاس‌هایی هستند که نمی‌توانند شیء بسازند. یک کلاس abstract می‌تواند متدهای abstract و غیرabstract را به‌طور هم‌زمان دربر گیرد درحالی‌که ایجادکردن متد abstract تنها در کلاس abstract ممکن است. در یک کلاس abstract ما صرفا می‌توانیم امضای متد abstract را تعریف نماییم زیرا مجاز نیستیم بدنه‌ی آن‌را در کلاس abstract تعریف کنیم. تنهاراه تعریف بدنه‌ی متد abstract این است که آن‌را در کلاسی که از کلاس abstract وراثت یافته تعریف نماییم.

امضای کلاس‌ها و متدهای abstract را با استفاده از نوشتن واژه‌ی کلیدی «abstract» در اعلان آن‌ها داخل کلاس‌های abstract تعریف می‌کنیم. البته هنگامی که بدنه‌ی متد abstractمان را در کلاس دیگری که از کلاس abstract آن ارث برده‌ باشد تعریف کنیم کلیدواژه‌ی «override» را دراعلان آن می‌نویسیم. یک کلاس abstract، انتزاع (abstraction) راتعریف می‌کند.

مثال

abstract class Human
{
   abstract public void FirstAbstractMethod();
   abstract public void SecondAbstractMethod();
   public void NonAbstractMethod()
   {
      Console.WriteLine("This is an non-abstract method
         in an abstract class");
   }
}
 
class Man: Human
{
   public override void FirstAbstractMethod()
   {
      Console.WriteLine("This is a first abstract method's
         body which is defined in a non-abstract class
         which inherits abstract class ");
   }
   public override void SecondAbstractMethod()
   {
      Console.WriteLine("This is a second abstract method's
         body which is defined in a non-abstract class
         which inherits abstract class ");
   }
 
}
 
class Program
{
   static void Main(string[] args)
   {
 
      Man ali = new Man();
      ali. FirstAbstractMethod();
      ali. SecondAbstractMethod();
 
 
   }
}

کلاس‌های مهر و موم شده

کلاس‌های مهرو موم شده کلاس‌هایی هستند که نمی‌توان ازآن‌ها ارث‌بری کرد. چنانچه خواستید قابلیت ارث‌بری را از مرحله‌ی کلاس متوقف سازید باید از واژه‌ی کلیدی «sealed»  در اعلان کلاس استفاده نمایید.

مثال

sealed class example
{
   public int SealedMethod()
   {
      int x = 2;
      return x;
   }
 
}
 
class Program
{
   static void Main(string[] args)
   {
      example Obj = new example();
      Obj.SealedMethod();
 
   }
}

کلاس‌های جزئی

کلاس‌های جزئی درواقع قطعاتی از کلاس‌های مشابه هستند که توسط برنامه‌نویسان متعددی به‌صورت جداگانه و به‌سادگی قابل‌استفاده‌اند. اما برای کامپایلر باید درغالب یک کلاس ارائه شوند. ما برای هرکدام از قطعات این کلاس‌ها از واژه‌ی کلیدی «partial» استفاده می‌کنیم.

مثال

partial class Employee
{
   public void methodA()
   { }
   public void methodB()
   { }
}
 
 
 
class Finance
{
}
 
partial class Employee
{
   public void methodX()
   { }
   public void methodY()
   { }
}

اشیا

دومین محور یک زبان برنامه‌نویسی شی‌گرا، اشیا هستند که این اشیاء همواره دارای فعالیت‌ها (method) و خواص (properties) می‌باشند.

ما می‌توانیم این مطلب را با بررسی یک مثال ازدنیای واقعی درک کنیم. فرض کنید ما یک حیوان خانگی داریم. یک گربه‌ی سه کیلوگرمی با چشم‌های آبی‌رنگ که یک‌سال از عمرش می‌گذرد. در این مثال گربه یک شیء است که ویژگی‌های وزن سه‌کیلوگرمی، چشمان آبی‌رنگ و عمر یک‌ساله خواص آن می‌باشند. فعالیت‌هایی که انجام می‌دهد اعم‌اند از میومیوکردن، پریدن، دیدن و شنوایی قوی. به یاد داشته‌باشید که اشیا تنها با یک کلاس متناظراند ولی کلاس‌ها، اشیاء متعددی را به‌طور همزمان می‌توانند بسازند.

قالب تعریف اشیاء به‌صورت زیر است:

className objectName = New classConstructor();

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

 ClassName obj = New ClassName();

متدها

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

کلا چهار نوع متد وجود دارد:

نوع اول: متدی که ورودی را از کاربر دریافت کرده و خروجی را به او بازگشت می‌دهد. یعنی هم ورودی دریافت می‌کند، وهم خروجی را ارائه می‌نماید و  نوع مقدارخروجی را نیز برگشت می‌دهد. (راهنمایی: مثال‌هایی از نوع مقدار خروجی، int و double هستند.)

مثال

// using class that we made above
 
class ClassName
{
   // making method
 
   public int addition(int x, int y)
 
   {
      return x + y;
   }
}

نوع دوم: تنها ورودی دریافت می‌کند و فاقد مقدار بازگشتی است. (مقدار بازگشتی آن void خوانده می‌شود.)

مثال

// using class that we made above
 
class ClassName
{
   // making the method
 
   public void addition(int x, int y)
   {
      Console.WriteLine("Your sum is equal to
         {0}", x + y);
      Console.ReadLine();
   }
}

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

مثال

// using class that we made above
 
class ClassName
{
   // making the method
 
   public int addition()
   {
      int x = 30;
      int y = 20;
      return x + y;
   }
}

نوع چهارم: به‌جای دریافت ورودی ویا ارائه‌ی مقدار خروجی، پردازش انجام می‌دهد.

مثال

// using class that we made above
 
class ClassName
{
   // making the method
 
   public void addition()
   {
      int x = 30;
      int y = 20;
      Console.WriteLine("Your sum is equal to :
         {0}", x + y);
      Console.ReadLine();
   }
}

متدهای نمونه‌سازی‌شده  (instance method)و غیرنمونه‌سازی‌شده (non-intance method) به‌شکل آمده در پایین تفکیک می‌شوند:

متد نمونه‌سازی‌شده (Instance Method)

متدی که ازطریق شیء ایجادشده از کلاس مربوطه فراخوانی می‌شود، ازنوع نمونه‌سازی‌شده (instance) است و تنها متدهای غیرنمونه‌سازی‌شده می‌تواند آن‌را فراخوانی کند.

مثال

class Mathematics   //class
{
   public int GetSum(int x, int y)   // instanced method
   {
      return x + y;
   }
}
 
static void Main(string[] args)   //main program
 
{
 
   Mathematics m = new Mathematics();
   m.GetSum(12, 45);   // instanced method call
 
}

متد غیرنمونه‌سازی شده (Non-instance Method)

متدی که بدون ایجاد شی از کلاس مربوطه و به‌طور مستقیم، از آن کلاس قابل فراخوانی باشد متد غیرنمونه‌سازی‌شده (non-instance) است. این متدها، متدهای استاتیک (static) نیز نامیده می‌شوند و اعضای استاتیک، تنها قادر به فراخوانی اعضای استایتک می‌باشند.

مثال

class Mathematics   //class
{   //static methods
   public static long GetProduct(int x, int y)
   {
      return x * y;
   }
}
 
static void Main(string[] args)
{
   // non-Instanced method call or
   // static method call
   Mathematics.GetProduct(12, 33);
}

وراثت

وراثت راهی برای رسیدن به تعامل میان دو کلاس متفاوت می‌باشد. ما می‌توانیم از متد متعلق به کلاس مادر، در کلاس فرزند سودجوییم (کلاس فرزند از کلاس مادر ارث‌بری کرده‌است) ولی به‌طور هم‌زمان از بیش‌از یک کلاس نمی‌توانیم ارث‌بری کنیم و فقط یک کلاس درلحظه قابل ارث‌بری است، زیرا ارث‌بری چندگانه (multi-inheritance) در C# مجاز نمی‌باشد، لیکن استفاده از ارث‌بری چندگانه به‌صورت پله‌ای(multi-level inheritance) مجاز است.

ارث‌بری چندگانه ارث‌بری پله‌ای

              ارث‌بری چندگانه                            ارث‌بری پله‌ای

نحو (Syntax)

Class firstClassName : secondClassName
{
   // body
}

مثال

در زیر دو کلاس مختلف با نام‌های “TeachingStaff” و “NonTeachingStaff” آمده‌اند:

class NonTeachingStaff   // first class or parent class
{
   public void fees collection()
   {
      Console.WriteLine("Used to collect fees from students");
   }
 
   public void Annoucement()
   {
      Console.WriteLine("Used to make annoucement");
   }
 
   class TeachingStaff   // second class or child class
   {
      public void Subject()
      {
         Console.WriteLine("Computer,English,Science");
      }
   }
}

پس‌از وراثت

class Teaching:NonTeachingStaff   // inheritance
{
   public void subject()
 
   {
      Console.WriteLine("Computer,English,Science");
 
   }
}

چندریختی (Polymorphism)

اتخاذ روشی چندگانه برای به‌انجام رساندن یک کار؛ تحت عنوان چندریختی شناخته می‌شود. چندریختی برای یک متد حالت‌های متنوعی را تدارک می‌بیند. دونوع چندریختی وجود دارد:

چندریختی ایستا (Static)

چندریختی پویا (Dynamic)

چندرختی ایستا

چندریختی ایستا از متدِ کلاس، بدون ارث‌بری استفاده می‌کند به‌طوری‌که از دو یا چند متد هم‌نام با امضاهای متفاوت برخوردار است. چندریختی ایستا به‌عنوان method overloading نیز خوانده می‌شود.

هنگامی‌که در یک کلاس دو یا چند متد هم‌نام داشته‌باشیم از قابلیت overloading استفاده می‌کنیم. بدین‌منظور و برای به‌کار بردن overloading برای متدهای هم‌نام، اگر تعداد پارامترها یک‌سان باشد، نوع داده‌های پارامترها را تغییر می‌دهیم، یا با نوع پارامترهای یکسان، تعداد پارامترها را تغییر داده و نسبت‌به هم تفاوت ايجاد می‌کنیم.

مثال

class Mathematics
{
   public int GetSum(int x, int y)
   {
      return x + y;
   }
 
   //GetSum(2 float)
   public float GetSum(float x, float y)
   {
      return x + y;
   }
 
   // GetSum(3 float)
   public float GetSum(float a, float b, float c)
   {
      return a + b + c;
   }
}

چندریختی پویا (Dynamic Polymorphism)

پلی مورفیسم پویا از متدهای خودش همراه با ارث بری استفاده می کند. Method overriding، مفهوم پلی مورفیسم پویا را برای ما امکان پذیر می کند، به طوری که می توان اینطور گفت که زمانی که ما دو کلاس همنام  با متدهای مشابه داریم، بعد از این که ارث بری های مورد نیاز انجام شوند، کامپایلر در مورد این که کدام کلاس را implement  کند، دچار سردرگمی می شود. راه حل این موضوع این است که باید متد پدر را  "virtual" و متد فرزند را  "override." کنیم . این روش ، Method overriding  یا پلی مورفیسم پویا نامیده می شود.

ما زمانی از method overriding  استفاده می کنیم که متدهایی با نام های مشابه در کلاس های مختلف داشته باشیم. به این منظور، کلمه کلیدی "virtual" به معنای پنهان سازی متد است و کلمه کلیدی "override" به معنی استفاده از همین متد پنهان شده است . ما می توانیم از کلمه کلیدی  "virtual" تنها برای یک متد استفاده کنیم ولی در مورد کلمه کلیدی "override" اینطور نیست. یعنی می تواند در چندین متد مورد استفاده قرار بگیرد.

مثال:

class Finance
{
   public virtual void check()
   {
      Console.WriteLine("Virtual method example");
   }
 
}
 
 
class Male:Finance
{
   public override void check()
   {
      Console.WriteLine("override method example");
   }
}
 
 
class Female:Finance
{
   public override void Speak()
   {
      Console.WriteLine("override method example");
   }
}

Abstraction

کلاس‌هایی  abstract هستند که قالبی را برای سایر کلاس‌ها تدارک دیده‌اند و اجازه‌ی ساخت شی را نمی‌دهند. کلاس‌های abstract می‎توانند شامل متدهای abstract و غیرabstract شوند.

ما برای تعریف امضای کلاس‌ها و متدهای abstract واژه‌ی کلیدی “abstract” را در اعلان آن می‌نویسیم. زمانی‌که یک متد abstract را در کلاس‌های دیگری که از کلاسی abstract ارث‌بری کرده‌اند تعریف کرده‌باشیم، واژه‌ی کلیدی “override” را در اعلان این متدها می‌نویسیم.

مثال

abstract class Parent
{
   abstract public void AnFirstAbstractMethod();
   abstract public void AnSecondAbstractMethod();
   public void NonAbstract()
   {
      Console.WriteLine("This is an non-abstract method
         in an abstract class");
   }
}
 
 
 
 
class Child: Parent
{
   public override void AnFirstAbstractMethod ()
   {
      Console.WriteLine("This is a first abstract method's
         body which is defined in a non-abstract class which
         inherits abstract class ");
   }
   public override void AnSecondAbstractMethod ()
   {
      Console.WriteLine("This is a second abstract method's
         body which is defined in a non-abstract class which
         inherits abstract class ");
   }
 
}
 
 
 
class Program
{
   static void Main(string[] args)
   {
 
      Child obj = new Child();
      Console.ReadLine();
   }
}

آموزش سی شارپ

سجاد باقرزاده

نویسنده 54 مقاله در برنامه نویسان
  • C#.net
  • 3k بازدید
  • 5 تشکر

کاربرانی که از نویسنده این مقاله تشکر کرده اند

در صورتی که در رابطه با این مقاله سوالی دارید، در تاپیک های انجمن مطرح کنید