سه شنبه ۱۸ دي ۱۴۰۳
Tut24 آموزش برنامه نویسی و مجله تخصصی فناوری ورود/عضویت

آموزش سی شارپ - کلاس ها

هنگامی که یک کلاس تعریف می کنید، یک طرح برای یک نوع داده تعریف می کنید. این عملاً هیچ داده ای را تعریف نمی کند، اما معنای نام کلاس را تعریف می کند. به این معنی که یک شیء از کلاس شامل چه چیزهایی است و چه عملیاتی روی آن شیء می توان انجام داد. شیء ها نمونه هایی از یک کلاس هستند. متدها و متغیرهایی که یک کلاس را تشکیل می دهند، عضوهای کلاس نامیده می شوند.

تعریف یک کلاس

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

<access specifier> class  class_name {
   // member variables
   <access specifier> <data type> variable1;
   <access specifier> <data type> variable2;
   ...
   <access specifier> <data type> variableN;
   // member methods
   <access specifier> <return type> method1(parameter_list) {
      // method body
   }
   <access specifier> <return type> method2(parameter_list) {
      // method body
   }
   ...
   <access specifier> <return type> methodN(parameter_list) {
      // method body
   }
}

توجه −

  • تعیین‌کننده‌های دسترسی، قوانین دسترسی برای اعضا و همچنین خود کلاس را مشخص می کنند. اگر مشخص نشده باشد، تعیین کننده دسترسی پیش فرض برای نوع کلاس internal است. دسترسی پیش فرض برای اعضا private است.

  • نوع داده، نوع متغیر را مشخص می کند، و نوع بازگشتی، نوع داده ای که متد در صورت وجود برمی گرداند، را مشخص می کند.

  • برای دسترسی به اعضای کلاس، از عملگر نقطه (.) استفاده می شود.

  • عملگر نقطه، نام یک شیء را با نام یک عضو ارتباط می دهد.

مثال زیر، مفاهیمی که تاکنون بحث شده را نشان می دهد −

using System;

namespace BoxApplication {
   class Box {
      public double length;   // Length of a box
      public double breadth;  // Breadth of a box
      public double height;   // Height of a box
   }
   class Boxtester {
      static void Main(string[] args) {
         Box Box1 = new Box();   // Declare Box1 of type Box
         Box Box2 = new Box();   // Declare Box2 of type Box
         double volume = 0.0;    // Store the volume of a box here

         // box 1 specification
         Box1.height = 5.0;
         Box1.length = 6.0;
         Box1.breadth = 7.0;

         // box 2 specification
         Box2.height = 10.0;
         Box2.length = 12.0;
         Box2.breadth = 13.0;
           
         // volume of box 1
         volume = Box1.height * Box1.length * Box1.breadth;
         Console.WriteLine("Volume of Box1 : {0}",  volume);

         // volume of box 2
         volume = Box2.height * Box2.length * Box2.breadth;
         Console.WriteLine("Volume of Box2 : {0}", volume);
         Console.ReadKey();
      }
   }
}

هنگامی که کد فوق کامپایل و اجرا می شود، نتیجه زیر را تولید می کند −

Volume of Box1 : 210
Volume of Box2 : 1560

توابع عضو و کپسوله‌سازی (Encapsulation)

تابع عضو کلاس، یک تابع است که تعریف یا پروتوتایپ آن در تعریف کلاس وجود دارد و مانند هر متغیر دیگری است. این تابع بر روی هر شیء از کلاسی که عضو آن است عمل می کند و به تمامی اعضای یک کلاس برای آن شی دسترسی دارد.

متغیرهای عضو، ویژگی های یک شیء (از منظر طراحی) هستند و برای پیاده‌سازی کپسوله‌سازی، به صورت private تعریف شده‌اند. این متغیرها فقط با استفاده از توابع عضو عمومی قابل دسترسی هستند.

بیایید این مفاهیم را برای تنظیم و دریافت مقدار اعضای مختلف یک کلاس در یک کلاس اعمال کنیم −

using System;

namespace BoxApplication {
   class Box {
      private double length;   // Length of a box
      private double breadth;  // Breadth of a box
      private double height;   // Height of a box
      
      public void setLength( double len ) {
         length = len;
      }
      public void setBreadth( double bre ) {
         breadth = bre;
      }
      public void setHeight( double hei ) {
         height = hei;
      }
      public double getVolume() {
         return length * breadth * height;
      }
   }
   class Boxtester {
      static void Main(string[] args) {
         Box Box1 = new Box();   // Declare Box1 of type Box
         Box Box2 = new Box();
         double volume;
         
         // Declare Box2 of type Box
         // box 1 specification
         Box1.setLength(6.0);
         Box1.setBreadth(7.0);
         Box1.setHeight(5.0);
         
         // box 2 specification
         Box2.setLength(12.0);
         Box2.setBreadth(13.0);
         Box2.setHeight(10.0);
         
         // volume of box 1
         volume = Box1.getVolume();
         Console.WriteLine("Volume of Box1 : {0}" ,volume);
         
         // volume of box 2
         volume = Box2.getVolume();
         Console.WriteLine("Volume of Box2 : {0}", volume);
         
         Console.ReadKey();
      }
   }
}

پس از کامپایل و اجرای کد بالا، نتیجه زیر تولید می‌شود −

Volume of Box1 : 210
Volume of Box2 : 1560

سازندگان C#

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

یک سازنده دقیقاً همان نام کلاس را دارد و هیچ نوع بازگشتی ندارد. مثال زیر مفهوم سازنده را توضیح می‌دهد −

using System;

namespace LineApplication {
   class Line {
      private double length;   // Length of a line
      
      public Line() {
         Console.WriteLine("Object is being created");
      }
      public void setLength( double len ) {
         length = len;
      }
      public double getLength() {
         return length;
      }

      static void Main(string[] args) {
         Line line = new Line();    
         
         // set line length
         line.setLength(6.0);
         Console.WriteLine("Length of line : {0}", line.getLength());
         Console.ReadKey();
      }
   }
}

هنگامی که کد بالا کامپایل و اجرا می‌شود، نتیجه زیر را تولید می‌کند −

Object is being created
Length of line : 6

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

using System;

namespace LineApplication {
   class Line {
      private double length;   // Length of a line
      
      public Line(double len) {  //Parameterized constructor
         Console.WriteLine("Object is being created, length = {0}", len);
         length = len;
      }
      public void setLength( double len ) {
         length = len;
      }
      public double getLength() {
         return length;
      }
      static void Main(string[] args) {
         Line line = new Line(10.0);
         Console.WriteLine("Length of line : {0}", line.getLength()); 
         
         // set line length
         line.setLength(6.0);
         Console.WriteLine("Length of line : {0}", line.getLength()); 
         Console.ReadKey();
      }
   }
}

هنگامی که کد بالا کامپایل و اجرا می‌شود، نتیجه زیر را تولید می‌کند −

Object is being created, length = 10
Length of line : 10
Length of line : 6

مخرب‌ها (Destructors) در C#

یک مخرب، عضوی ویژه‌ای از یک کلاس است که هرگاه یک شیء از کلاس به خارج از حیطه می‌رود، اجرا می‌شود. مخرب دقیقاً همان نام کلاس را با یک تیلد یا مد (~) پیشوند دارد و نه مقداری برمی‌گرداند و نه می‌تواند هیچ پارامتری دریافت کند.

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

مثال زیر مفهوم مخرب را توضیح می‌دهد −

using System;

namespace LineApplication {
   class Line {
      private double length;   // Length of a line
      
      public Line() {   // constructor
         Console.WriteLine("Object is being created");
      }
      ~Line() {   //destructor
         Console.WriteLine("Object is being deleted");
      }
      public void setLength( double len ) {
         length = len;
      }
      public double getLength() {
         return length;
      }
      static void Main(string[] args) {
         Line line = new Line();

         // set line length
         line.setLength(6.0);
         Console.WriteLine("Length of line : {0}", line.getLength());           
      }
   }
}

هنگامی که کد بالا کامپایل و اجرا می‌شود، نتیجه زیر را تولید می‌کند −


Object is being created
Length of line : 6
Object is being deleted

اعضای استاتیک یک کلاس در سی شارپ

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

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

مثال زیر نحوه استفاده از متغیرهای استاتیک را نشان می‌دهد:

using System;

namespace StaticVarApplication {
   class StaticVar {
      public static int num;
      
      public void count() {
         num++;
      }
      public int getNum() {
         return num;
      }
   }
   class StaticTester {
      static void Main(string[] args) {
         StaticVar s1 = new StaticVar();
         StaticVar s2 = new StaticVar();
         
         s1.count();
         s1.count();
         s1.count();
         
         s2.count();
         s2.count();
         s2.count();
         
         Console.WriteLine("Variable num for s1: {0}", s1.getNum());
         Console.WriteLine("Variable num for s2: {0}", s2.getNum());
         Console.ReadKey();
      }
   }
}

با اجرای کد بالا، نتیجه زیر تولید می شود −

Variable num for s1: 6
Variable num for s2: 6

شما همچنین می‌توانید یک تابع عضو را به عنوان استاتیک تعریف کنید. چنین توابعی تنها به متغیرهای استاتیک دسترسی دارند. توابع استاتیک حتی قبل از ایجاد شدن شی وجود دارند. مثال زیر استفاده از توابع استاتیک را نشان می‌دهد −

using System;

namespace StaticVarApplication {
   class StaticVar {
      public static int num;
      
      public void count() {
         num++;
      }
      public static int getNum() {
         return num;
      }
   }
   class StaticTester {
      static void Main(string[] args) {
         StaticVar s = new StaticVar();
         
         s.count();
         s.count();
         s.count();
         
         Console.WriteLine("Variable num: {0}", StaticVar.getNum());
         Console.ReadKey();
      }
   }
}

وقتی کد بالا کامپایل و اجرا می‌شود، نتیجه زیر را تولید می‌کند −

Variable num: 3