CodeGym /وبلاگ جاوا /Random-FA /روابط بین طبقات وراثت، ترکیب و تجمیع
John Squirrels
مرحله
San Francisco

روابط بین طبقات وراثت، ترکیب و تجمیع

در گروه منتشر شد
سلام! امروز نگاهی دقیق‌تر به یکی از اصول برنامه‌نویسی شی گرا (OOP) خواهیم داشت: وراثت. ما همچنین انواع دیگر روابط بین کلاس ها را مطالعه خواهیم کرد: ترکیب و تجمیع. روابط بین طبقات  وراثت، ترکیب و تجمیع - 1این موضوع دشوار نخواهد بود: شما قبلاً بارها در درس های گذشته با ارث و نمونه هایی از ارث مواجه شده اید. امروز، مهمترین چیز این است که دانش خود را تقویت کنید، مکانیسم وراثت را با جزئیات بیشتر بررسی کنید، و یک بار دیگر نمونه هایی را مرور کنید. :) خب، بریم!

وراثت در جاوا و مزایای آن

همانطور که مطمئناً به یاد دارید، وراثت مکانیزمی است که به شما امکان می دهد یک کلاس جدید را بر اساس یک کلاس موجود (کلاس والد) توصیف کنید. با انجام این کار، کلاس جدید ویژگی ها و عملکرد کلاس والد را قرض می گیرد. بیایید نمونه ای از وراثت را که در درس های قبلی ارائه شده است، به یاد بیاوریم:
public class Car {

   private String model;
   private int maxSpeed;
   private int yearOfManufacture;

   public Car(String model, int maxSpeed, int yearOfManufacture) {
       this.model = model;
       this.maxSpeed = maxSpeed;
       this.yearOfManufacture = yearOfManufacture;
   }


public void gas() {
       // Gas
   }

   	public void brake() {
       // Brake
   }
}


public class Truck extends Car {

   public Truck(String model, int maxSpeed, int yearOfManufacture) {
       super(model, maxSpeed, yearOfManufacture);
   }
}



public class Sedan extends Car {
   public Sedan(String model, int maxSpeed, int yearOfManufacture) {
       super(model, maxSpeed, yearOfManufacture);
   }
}
ما برنامه خاصی داریم که شامل کار با انواع مختلف خودرو می شود. حتی اگر از علاقه مندان به اتومبیل نباشید، احتمالاً می دانید که انواع بسیار زیادی از اتومبیل ها در جهان وجود دارد. :) بر این اساس، ویژگی های مشترک خودروها را به یک کلاس والد مشترک به نام Car. پس چه چیزی در همه خودروها صرف نظر از نوع آنها مشترک است؟ هر خودرو دارای یک سال ساخت، نام مدل و حداکثر سرعت است. ما این ویژگی ها را در فیلدهای، و قرار modelمی maxSpeedدهیم yearOfManufacture. در مورد رفتار، هر ماشینی می تواند شتاب بگیرد و سرعتش را کاهش دهد. :) ما این رفتار را در متدهای gas()و تعریف می کنیم brake(). این چه مزایایی برای ما دارد؟ اول از همه، مقدار کد را کاهش می دهد. البته می توانیم بدون کلاس والد هم کار کنیم. اما از آنجایی که هر خودرو باید بتواند شتاب بگیرد و سرعتش را کاهش دهد، ما باید در کلاس‌های ،،، و کلاس‌ها و در هر کلاس خودروی دیگری gas()روش‌هایی ایجاد کنیم. تصور کنید چه مقدار کد اضافی باید بنویسیم. و فیلدهای ، و و را فراموش نکنید : اگر از شر کلاس والد خلاص شویم، باید آنها را در هر کلاس خودرو ایجاد کنیم! وقتی چند کلاس ماشین داریم، مقدار کدهای تکراری واقعا جدی می شود. انتقال فیلدها و روش‌های رایج (که «حالت‌ها» و «رفتارها» نیز نامیده می‌شوند) به یک کلاس والد به ما امکان می‌دهد در زمان و مکان زیادی صرفه‌جویی کنیم. اگر برخی از انواع خودروها دارای خواص منحصر به فرد یا روش هایی هستند که انواع دیگر خودروها فاقد آن هستند، مشکل بزرگی نیست. همیشه می‌توانید آن‌ها را در یک کلاس نسل و جدا از بقیه ایجاد کنید. brake()TruckSedanF1CarSportsCarmodelmaxSpeedyearOfManufactureروابط بین طبقات  وراثت، ترکیب و تجمیع - 2
public class F1Car extends Car {

   public void pitStop() {

       // Only race cars make pit stops
   }

   public static void main(String[] args) {

       F1Car formula1Car = new F1Car();
       formula1Car.gas();
       formula1Car.pitStop();
       formula1Car.brake();
   }
}
بیایید به عنوان مثال به خودروهای مسابقه فرمول یک نگاه کنیم. برخلاف "بستگان" خود، آنها رفتار منحصر به فردی دارند - آنها هر از گاهی یک پیت استاپ می کنند. این ما را اذیت نمی کند. ما قبلاً رفتار رایج در Carکلاس والد را توضیح داده‌ایم و رفتار خاص کلاس‌های نسل را می‌توان به آن کلاس‌ها اضافه کرد. روابط بین طبقات  وراثت، ترکیب و تجمیع - 3در مورد فیلدها هم همینطور است: اگر یک کلاس فرزند دارای ویژگی های منحصر به فرد باشد، ما با آرامش این فیلدها را در کلاس فرزند اعلام می کنیم و دیگر نگران نمی شویم. :) قابلیت استفاده مجدد از کد مزیت اصلی ارث بری است. برای برنامه نویسان، نوشتن کد اضافی بسیار مهم است. شما بارها و بارها در کار خود به این موضوع برخورد خواهید کرد. لطفاً چیز مهم دیگری را به خاطر بسپارید: جاوا ارث چندگانه ندارد . هر کلاس فقط یک کلاس را به ارث می برد. در درس های آینده بیشتر در مورد دلایل این موضوع صحبت خواهیم کرد. فعلا فقط یادت باشه به هر حال، این امر جاوا را از سایر زبان های OOP متفاوت می کند. به عنوان مثال، C++ از وراثت چندگانه پشتیبانی می کند. با ارث همه چیز کم و بیش روشن است. بیایید ادامه دهیم.

ترکیب و تجمیع

کلاس ها و اشیاء را می توان با هم پیوند داد. وراثت یک رابطه "is-a" را توصیف می کند. شیر یک حیوان است. چنین رابطه ای به راحتی با استفاده از وراثت بیان می شود، جایی که Animalطبقه والد و Lionفرزند است. با این حال، همه روابط به این شکل توصیف نمی شوند. به عنوان مثال، یک صفحه کلید قطعا به یک کامپیوتر مرتبط است، اما یک کامپیوتر نیست . دست ها به نوعی با یک شخص مرتبط هستند، اما آنها یک شخص نیستند. در این موارد نوع دیگری از رابطه داریم: نه «است-الف»، بلکه «دارا-الف». دست یک شخص نیست، بلکه بخشی از یک شخص است. صفحه کلید یک کامپیوتر نیست، بلکه بخشی از یک کامپیوتر است. یک رابطه has-a را می توان در کد با استفاده از ترکیب و تجمیع توصیف کرد . تفاوت در "سخت" بودن رابطه نهفته است. بیایید یک مثال ساده بزنیم: ما یک Carکلاس داریم. هر ماشینی یک موتور دارد. علاوه بر این، هر ماشینی مسافر دارد. Engine engineتفاوت اساسی بین و فیلدها چیست Passenger[] passengers؟ نشستن مسافر Aدر ماشین به این معنی نیست که مسافران در ماشین نیستند B. Cیک ماشین می تواند با چندین مسافر مطابقت داشته باشد. علاوه بر این، اگر همه سرنشینان از یک ماشین پیاده شوند، باز هم به خوبی کار می کند. رابطه بین Carکلاس و Passenger[] passengersآرایه سخت تر است. به آن تجمیع می گویند . مثال خوب دیگری از تجمیع ارائه می دهد. فرض کنید ما یک Studentکلاس و یک StudentGroupکلاس داریم. یک دانش آموز می تواند به چندین سازمان دانشجویی بپیوندد: یک باشگاه فیزیک، یک کلوپ هواداران جنگ ستارگان، و/یا یک باشگاه کمدی دانشجویی. ترکیب نوعی رابطه سخت‌تر است. هنگام استفاده از ترکیب، یک شی بخشی از یک شی است و نمی تواند به شی دیگری از همان نوع تعلق داشته باشد. ساده ترین مثال موتور ماشین است. موتور بخشی از یک ماشین است و نمی تواند بخشی از ماشین دیگری باشد. همانطور که می بینید، رابطه آنها بسیار سخت تر از رابطه بین Carو Passengers. روابط بین طبقات  وراثت، ترکیب و تجمیع - 4
نظرات
TO VIEW ALL COMMENTS OR TO MAKE A COMMENT,
GO TO FULL VERSION