اینترفیس ( interface ) در برنامه نویسی چیست و چه کاربردی دارد؟

اینترفیس ( interface ) در برنامه نویسی چیست و چه کاربردی دارد؟

بروزرسانی : 5 ماه پیش
دسته بندی :‌ - شی گرائی

اینترفیس ( interface ) در برنامه نویسی چیست ؟‌

آموزش interface ها در برنامه نویسی شی گرا

یک اینترفیس ( interface ) توضیحی است درباره ی  عملیاتی که هر شی در برنامه نویسی قرار است انجام دهد.

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

در برنامه نویسی شی گرا هم یک اینترفیس توضیحی است برای تمامی تابع هایی که باعث میشود شی خاصی به X تبدیل شود. مثال روشن شدن لامپ را در نظر داشته باشید اگر بخواهیم برای شی لامپ یک اینترفیس بنویسیم باید متود turn_on() برای روشن شدن لامپ و متود turn_off() را برای خاموش کردن لامپ در نظر داشته باشیم.

هدف کلی اینترفیس ها این است که این خصوصیت ها را به کامپیوتر بفهماند و همچنین اعلام کند که یک شی از نوع T باید متود های X Y Z و ... را داشته باشد.

 

اینترفیس ( interface ) در برنامه نویسی شی گرا 

یک اینترفیس در برنامه نویسی شی گرا ، یک سینتکس یا ساختار برنامه نویسی است که کامپیوتر را وادار میکند تا خصوصیت هایی را به یک شی یا آبجکت اختصاص دهد.

برای نمونه تصور کنید ما یک کلاس به نام Car برای ساختن ماشین و یک کلاس به نام scooter برای ساخت اسکوتر و یک کلاس دیگر به نام truck برای ساختن کامیون داریم.

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

در ادامه سینتکس پیاده سازی اینترفیس را خواهیم نوشت تا بصورت کامل درک کنید.

 

نمونه کد اینترفیس ( interface )

کدنویسی و پیاده سازی اینترفیس ها در شی گرایی ساده و مشابه پیاده سازی کلاس ها است. درون آکولاد یک interface ، باید چند متود نوشته شده باشد که این متود ها حتما باید توسط آبجکت هایی که interface را پیروی میکنند وجود داشته باشد.

هر اینترفیس ( interface ) یک فایل مختص برای خود دارد که همنام با فایل خود است و در پایان نیز نوع فایل نوع زبان برنامه نویسی هست که استفاده میکنید مثل نقطه php یا نقطه as یا ...

اینترفیسی که در ادامه بعنوان مثال آورده ایم درون فایلی با نام Vehicle.as میباشد.

در زیر مثال vehicle را بصورت کدنویسی شده میبینید که در بالا مثال زدیم . توجه کنید که این یک مثال جزيی است.

 package  
          { 
             public interface Vehicle 
             { 
                 // NO data VARIABLES are allowed in an interface 
                 // only function PROTOTYPES 
 
 
                 /** 
                  * Comments... 
                  * Anything that wants to be a "Vehicle" must, implement this function 
                  */ 
                 function start_engine() : void; 
 
              
             } 
          } 

 

تفاوت بین کلاس ( class ) و اینترفیس ( interface )

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

  1. هیچ متغیری در اینترفیس ها قابل تعریف نیست.
    اینترفیس درباره ی اکشن هایی صحبت میکند که به آن ها اجازه داده شده است نه پیاده سازی و مقدار دهی به داده !
  2. بصورت پیشفرض تمامی توابع لیست شده در داخل یک اینترفیس public هستند و در صورت تعریف توابع phototype نیازی به قراردادن کلمه ی public در ابتدای توابع تعریف شده نیست.
  3. در توابعی phototype که لیست توابع هستند نیازی نیست آکولاد باز و بسته قرار بگیرد به سادگی همانطور که در مثال میبینید بحای آکولا یک سمی کالن ساده قرار داده شده است.

 

پیاده سازی یک اینترفیس ( interface )

اگر قصد داشته باشید یک کلاسی را بر پایه ی یک interface تعریف کنید یعنی تمامی متودهای آنرا در کلاس جدید خود استفاده کنید از کلمه ی implements استفاده میشود و توجه کنید که این کلمه برابر با extends یا ارث بری نیست ولی دقیقا در همان جا نوشته میشود.

در مثال زیر یک کلاس از نوع Car وجود دارد که از اینترفیس Vehicle ارث بری کرده است.

          package  
          { 
             public class Car implements Vehicle 
             { 
 
                 /** 
                  * Comments... 
                  * 
                  * Here is how we start our car.  This function is mandated by the Vehicle 
                  * interface. 
                  */ 
                 function start_engine() : void 
                 { 
                   // code to start the engine of the car... 
                 } 
              
             } 
          } 

نکته : همانطور که بالاتر گفتیم نوشتن متود های تعریف شده در interface اجباری است و بعد از این متود ها شما میتوانید هر متود اضافه ی دیگری هم در درون کلاس خود بنویسید.

 

Polymorphism در interface های برنامه نویسی شی گرایی

قدرت interface ها چیست ؟ قدرت اصلی interface ها زمانی مشخص میشود که چندین کلاس مختلف برپایه ی یک interface پیاده سازی شده باشند و از یک منظر همه ی آنها با هم دیگر معادل هستند.

برای مثال ما یک کلاس به نام Car و یک کلاس دیگر به نام Truck داریم و کل کاری که برنامه ی ما قرار است با این کلاس ها انجام دهد start کردن و drive کردن وسایل نقلیه است.

برای برنامه ی ما پس چیز مهم وسیله ی نقلیه یا Vehicles است و به نام آنها و جزئیات آنها کاری ندارد.

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

مثال بدون interface :‌

    
          // Main Actions 
          var car   : Car = new Car(); 
          var truck : Truck = new Truck(); 
           
          car.start_engine(); 
          truck.start_engine(); 
           
          car.drive(); 
          truck.drive(); 
            

مثال با interface 

    // Main Actions 
          var vehicle1   : Vehicle = new Car();    // here the only difference is the TYPE of each variable is the same!!!! 
          var vehicle2   : Vehicle = new Truck(); 
           
          vehicle1.start_engine(); 
          vehicle2.start_engine(); 
           
          vehicle1.drive(); 
          vehicle2.drive(); 
            

مثال با آرایه ها 

// Main Actions 
          var vehicles : Array = new Array(); 
           
          vehicles.push( new Car() );    // Assume our program is modeling a game or traffic simulation 
          vehicles.push( new Car() );    // The Cars and Trucks that we are modeling can be created in 
          vehicles.push( new Truck() );  // an arbitrary matter.  Normally we would have to create separate 
          vehicles.push( new Car() );    // arrays for Cars, Trucks, etc.  But because the are all vehicles 
          vehicles.push( new Truck() );  // we can put them in a single array of Vehicle. 
          vehicles.push( new Truck() ); 
          vehicles.push( new Truck() ); 
          vehicles.push( new Car() ); 
          vehicles.push( new Truck() ); 
          vehicles.push( new Car() ); 
          vehicles.push( new Bicycle() ); // assume Bicycle is also a Vehicle... 
          vehicles.push( new Car() ); 
 
 
          // Later on in the program, we want to start all the cars... 
          // We can use GENERIC programming (we don't care if they are cars, trucks, bicycle, etc, just that they are vehicles). 
 
          for each (var item : Vehicle in vehicles ) 
          { 
            item.start_engine(); 
            item.drive(); 
          } 
            
          

مثال بالا مفهوم Polymorphism را به شما نشان میدهد. ایده ی اصلی Polymorphism این است که ما نمیدانیم دقیقا داخل یک object یا شی چه چیزی وجود دارد.

در مثال بالا در قسمت آرایه ها ما نمیدانیم که دقیقا vehicles[i] کدام وسیله ی نقلیه است ممکن است car, truck, bicycle و ... باشد.

در برنامه نویسی کامپیوتر بدون Polymorphism ما قادر نیستیم هیچ کاری با شی ها یا object ها انجام بدهیم.

با استفاده از بحث Polymorphism کامپیوتر میفهمد که هر شی چیست و چه کاری قرار است انجام دهد در مثال بالا item.start_engine(); را میتوانیم داشته باشیم و بعد کامپیوتر میفهمد که item چه چیزی هست مثلا اگر truck بود بجای item عبارت truck گفته میشود و متود را  به این شکل صدا میزند :‌ truck.start_engine

اگر آیتم car باشد این متود به شکل car.start_engine و اگر XYZZY باشد به شکل XYZZY.start_engine میباشد.

 

ویژگی های منحصر به فرد درون یک interface

بعضی وقت ها شما نیاز دارید که تابع های خاصی را در درون یک interface داشته باشید. برای مثال یک dump truck از طریق Vehicle پیاده سازی میشود.

این dump truck ویژگی ها و توابع Vehicle را دارد ولی یک تابع دیگر و منحصر به فرد به نام raise_bed نیاز دارد که محتویات خود را از طریق پشت ماشین به بیرون بریزد.

وقتی dump truck توسط اینترفیس Vehicle پیاده سازی میشود کامپیوتر آنرا یک وسیله ی نقلیه با ویژگی های مشترک تمام وسایل نقلیه میداند و از تابع دیگر و منحصر به فردی به نام raise_bed آگاهی ندارد.

  var vehicle : Vehicle = new Dump_Truck(); 
           
          vehicle.start_engine(); // ALLOWED: vehicle is a Vehicle and thus has the start_engine function 
          vehicle.drive();        // ALLOWED: vehicle is a Vehicle and thus has the start_engine function 
 
          // Compile Time Type error 
          vehicle.raise_bed();    // NOT ALLOWED: while in reality (at run time) the vehicle variable 
                                  //              will contain a Dump_Truck and thus this should be a legal 
                                  //              operation, the compiler (at program time) only sees that 
                                  //              vehicle is a Vehicle and the Vehicle class dose not 
                                  //              have a raise_bed function. 
        
      

 

ولی شما بعنوان یک برنامه نویس میدانید که این وسیله ی نقلیه یک تابع به نام Dump_Truck نیاز دارد. کلمه ی as به شما کمک میکند تا این مفهوم را به کامپیوتر نیز بفهمانید.

حالا به کد زیر نگاه کنید که به کامپیوتر میگوید که این وسیله ی نقلیه یک تابع جدید به نام rease_bed دارد.

  var vehicle : Vehicle = new Dump_Truck(); 
           
          (vehicle as Dump_Truck).raise_bed();    //  ALLOWED: here the programmer overrides the type checking of the computer. 
 

 

جمع بندی

 در برنامه نویسی interface ها دو هدف مهم دارند :‌

  1. به برنامه نویسان کمک میکنند تا کارهای خود را بیشتر بصورت انتزاعی به انجام برسانند و این باعث صرفه جویی در زمان برنامه نویس خواهد شد.
    برای مثال  var vehicle : Vehicle به همه ی وسلیه های نقلیه اشاره دارد و مهم نیست که آن یک car یا یک truck یا هر چیز دیگری باشد. زمانی که تابع vehicle.start_engine صدا زده میشود اتفاقات بصورت run time رخ میدهد و تابع صحیح که با شی واقعی در ارتباط است فراخوانی میشود.
  2. برنامه نویس توان این را خواهد داشت که برای هر کلاسی که براساس یک interface پیاده سازی میشود توابع خاص را بنویسد.
لینک کوتاه این مقاله : https://avasam.ir/post/182
این سیستم برپایه ی علاقه مندی شما یک دوره ی مناسب به شما پیشنهاد میدهد
مرا بسوی بهترین دوره ی آموزشی که برای من مناسب است هدایت کن 🤖

دوره های آموزشی مرتبط با این مقاله :

برای استفاده ی دیگران و حمایت از ما در جامعه های زیر به اشتراک بگذارید

.:: نظرهای کاربران ::.
دوره ی آموزش پروژه محور ساخت کافه بازار دوره ی آموزش پروژه محور ساخت فروشگاه دیجیکالا آموزش لاراول دوره ی آموزش ویو جی اس