الفريق العربي للبرمجةأرشيف المنتديات · 2000 – 2023
نسخة أرشيفية للقراءة فقط — التسجيل والمشاركة مغلقان، والمحتوى محفوظ كما كان.

الوراثة في الجافا وما الطريقة لاتقانها !

بدأه thesharp في 29 يوليو 2009 · 10 رد · 9,046 مشاهدة · في JavaSE
مشاركة: واتساب X فيسبوك تيليجرام
#1 صاحب الموضوع

السلام عليكم ورحمة الله وبركاته

وبعد

احبتي الافاضل في هذا المنتدى الفاضل

مما قرأته في الجافا مميزات البرمجه الكائنية oop

وذكر احد المؤلفين مثال نظري وهو

لو فرضنا اننا لدينا مجموعه من الحيوانات واردنا ان نضع برنامجا يديرها

فاننا نضع صف اب يحوي جميع الاشياء المشتركه بين الحيواناتونسميه

(animals) يحتوي على

picture

food

hunger

boundaries

location

ـــــــــــــــــــــــــــــــــــــــ

makeNoise()

eat()

sleep()

roam()

----------------------

ثم تاتي الحيوانات ترث الصفات من هذا الاب

ياتي الاسد

الكلب

القط النمر وهكذا

ــــــــــــــــــــــــــــــــــــــــــــــــــــــــــــــــــــــــــــــــ

ـــــــــــــــ

تسائلاتي المؤلف بارك الله فيه

لم يضع مثال تطبيقي لهذا الشرح فلم استفد منه لاني اردت تطبيقه فلا ادري كيف يكون شكل الصفوف

في داخل البرنامج وكيف ترتيبها

اتمنى من الاخوة البارعين في الجافا ان يضع مثال فيه توارث ولو كان بسيطا ويكتب هنا الكود المناسب

وله جزيل الشكر والائمتنان

#2

وعليكــم السـلام ورحمة الله وبركاتـه..

هذه أول مشاركة لي منذ زمن طويل :) ..

تطبيق الوراثه برمجيا مشابه تماما لتطبيقها في الواقع ،، لذلك البرمجه باستخدام مفاهيم OOP تسهل الحلول وتجعل حل المشكلة يكون بنفس مصطلحات المشكله وهي ميزه جيده جدا لا توفرها الProcedural Programming .

فاذا كان لدينا كائن مثلا يمثل Person (له أسم وعمر ) وأردنا تطبيق موظف Employee فيمكن الإستفاده من الكائن الأول ووراثه الصفات (الإسم والعمر) للكائن Employee ومن ثم اضافة صفات أخرى خاصه بالموظف مثل الراتب ورقم الموظف وغيرها من التفاصيل ..

هذه الوراثه تساعد كثيرا ، حيث لن نكرر الكود مره أخرى هذا أولاً، ثانياً أنها تؤدي الى استخدام الPolymorphism حيث يمكن وقت التشغيل وضع قيمه أي كائن أبن (Employee) في الكائن الأب Person (وهذا طبيعي) وعند استدعاء دالة سيتم استدعاء الدالة المناسبة (سواء كانت في الإبن أو الأب) وهذا ما يسمى بdynmaic Binding .

في لغه جافا نفسها تستخدم الوراثه بشكل كبيير حقا ، حيث أن أي كائن في برنامج الجافا يرث الكائن Object ، والذي يحتوي على عده دوال يحتاجها أي كائن مثلا داله التساوي equals وداله لطباعه قيمه الكائن على شكل نص toString وهكذا ..

ولو نظرنا الى كلاسات GUI سنجد مثلا أن الكلاس JFrame يرث الكلاس القديم Frame ويضيف أمور أخرى (هذا مثال أخر على استخدام الوراثه وهي اضافية أمكانيات أخرى Extensibility للكلاسات القديمه) والكلاس Frame بنفسه يرث Window والذي يرث Container والذي يرث Component والذي يرث Object :) . وفي كل من هذه الطبقات دوال تختص بالكائن نفسه اضافة الى أنها احتاجت لإستخدام دوال في كلاس أخر فقامت بوراثته ..

وهكذا ستجد أن كلاسات الجافا كلها على شكل مدرج يعتمد أعتماد كبير على الوراثه ..

يمكنك مراجعه هذا الموضوع (هنا) ستجد في الأسفل في منتصف الموضوع فقره بعنوان "مثال على برنامج Company Employer " واستخدمت الوراثه في هذا المثال ..

بالتوفيق ،

http://informatic-ar.com منصة تعليمية عربية في علوم الحاسب والبرمجة

https://moalfat.com  للكتب الالكترونية والكورسات التعليمية

Everything we see now is just an engineering solution based on old science

#3

لو سمحت اخي الكريم

الان هذا الجزء

public class Programmer {
    private String name;
    private double salary;
    private int idNumber; 
    private String language

قمت بعمل صف باسم programmer يحتوي على اربع متغيرات للاسم وللراتب وللرقم واللغه

لماذا وضعنا كلمة private امام كل متغير مع انه ممكن الاستغناء عنها

__________________________________________________________________

ننتقل للجزء الثاني

الكود هو

 public Employee (int id , String name , double salary,Sting lang) {
        this.name = name;
        this.idNumber = id;
        this.salary = salary;
        this.language = lang;

ماذا نعتبره هل هو صف جديد ام وارث من الصف السابق ونلاحظ هنا كلمة this مقابل private في الاول

اتمنى من اخي الكريم ان توضح هذه التسائلات والله يعينك بنكمل باقي البرنامج بس افهم هذي الاول

#4

من أساسيات بناء الكلاسات هو مفهوم الEncapsulation "الكبسله" بمعنى أنك تستخدم شيء (بواسطه الدوال التي يقدمها) ولا يفترض أن تعرف طريقه عملها من الداخل.. الأن من سيستخدم الكلاس يعرف أنه عند بناء كائن يجب تمرير القيم الفلانيه ، ولكنه لا ينبغي أن يعرف ما هي العمليات من الداخل .. لذلك بما أنك ستستخدم تلك المتغيرات من الداخل فقط فيمكنك تحديدها بالمحدد Access Specifier الخاص private .

وعند عمل متغير أو دالة بالمحدد private فهذا يعني أنه لا تستطيع استخدامها الا من داخل الكلاس وهكذا نكون طبقنا خاصيه من الكبسله..

في حال عرفنا المتغير بدون أي محدد كما تريد فهذا يعني أنه سيكون Package Access بمعنى أن أي كلاس في نفس الباكج قام بعمل كائن من هذا الكلاس سوف يصل لذلك المتغير أو الدالة ..

الخيار لك ، هل تريد أن تضعها private أو Package Access أو حتى public ، كلها تعود على حسب تصميمك للكلاسات ، وعاده يفضل دائماً أن تكون private.

بالنسبة للthis وهي تعني "الكائن الحالي" وهنا تفرق بين المتغير name المرسل للدالة وبين المتغير name الموجود في الكائن .. في حال أزلتها سوف يتم اعتبار المتغير name في الدالة هو نفسه المرسل (بمعني سيتم اسناد المتغير لنفسه) ونحن نريد أن نضع قيمه المتغير في المتغير الموجود في الكلاس member method .. يمكنك تغيير اسم المتغير المرسل name الى اي اسم أخر لو أردت وأزل الthis حينها ..

طبعا الحديث اعلاه ينطبق على جميع المتغيرات وليس name فقط ..

أرجوا أن يكون الشرح واضح ،، وأي سؤال يرحب به..

بالتوفيق ..

http://informatic-ar.com منصة تعليمية عربية في علوم الحاسب والبرمجة

https://moalfat.com  للكتب الالكترونية والكورسات التعليمية

Everything we see now is just an engineering solution based on old science

#5

بالمناسبة الكلاس بهذا الشكل :

public class Programmer {
	private String name;
	private double salary;
	private int idNumber;
	private String language

	public Programmer (int id , String name , double salary,Sting lang) {
		this.name = name;
		this.idNumber = id;
		this.salary = salary;
		this.language = lang;
	}

	public int getId () {
		return idNumber;
	}

	public String getName () {
		return name;
	}

	public double getSalary () {
		return salary;
	}

	public String getLanguage () {
		return language;
	}

	public void setLanguage (String lang) {
		language = lang
	}

	public String toString() {
		return  idNumber + " : " + name + " , Language : " + language + " take " + salary + " $";
	}
}

وكان هناك خطأ مطبعي بسيط :) .. شكرا للأخ الشمري الذي نبهني على ذلك ،، وكده عرفنا ان بزور قسم الجافا من ورانا :P

يبدوا اني سأحتاج للصديق المحرر الإملائي كثيرا :) ..

بالتوفيق للجميع ،،

تم تعديل هذه المشاركة بواسطة Wajdy Essam في 29 يوليو 2009 في 21:24 — السبب: خطأ إملائي :) :)

http://informatic-ar.com منصة تعليمية عربية في علوم الحاسب والبرمجة

https://moalfat.com  للكتب الالكترونية والكورسات التعليمية

Everything we see now is just an engineering solution based on old science

#6

مشكور على التوضيح ولكن للاسف لم تصل الفكرة بعد

اتمنى ان تتحمل حتى توصل الفكرة

دعني افترض شي من عندي انا ممكن يكون اقرب لفهمي

وانت صوبني وسوي التعديلات والتوضيحات اللازمة

حسب فهمي في برنامج الموظفين اللي انت كتبته ما فيه الا كلاس واحد اللي هو programmer

على حد فهمي انه الكلاس لازم يكون مسبوق بكلمة class

طيب وين الكلاسات الاخرى التي ترث من الكلاس programmer

مازال فيه تشويش عندي في هذا الجانب احس كاني داخل مدينه اول مرة ازورها ومش عارف الاتجاهات ولا باي شارع

اتمنى توضح بالكود بيكون افضل لو تكرمت وانا شاكر ومقدر جهودك

#7

وعليكــم السـلام ورحمة الله وبركاتـه..

بالنسبة للكلاس Programmer فكان الحديث عن بناء كلاس يمثل البرمج ومن ثم "احتمال" أن تحتاج الشركه لأصناف أخرى من العملاء ، لذلك اخترنا الوراثه وقمنا بعمل كلاس رئيسي يمثل الموظف ويحتوي على البيانات الأساسية التي تتواجد في أي موظف (سواء مبرمج أو مدير أو فراش أو أي موظف أخر) .. :

public class Employee {
	private String name;
	private double salary;
	private int idNumber;

	public Employee (int id , String name , double salary) {
		this.name = name;
		this.idNumber = id;
		this.salary = salary;
	}

	public int getId () {
		return idNumber;
	}

	public String getName () {
		return name;
	}

	public double getSalary () {
		return salary;
	}

	public String toString() {
		return  idNumber + " : " + name + " take " + salary + " $";
	}
}

بعد ذلك ورثنا من الموظف للمبرمج هنا سندخل الصفات التي تخص المبرمج فقط مثل اللغه التي يستخدمها :

public class Programmer extends Employee {
	private String language;

	public Programmer (int id , String name ,double salary , String language) {
		super(id,name,salary);
		this.language = language;
	}

	public String getLanguage () {
		return language;
	}

	public String toString () {
		return super.toString() + "  ,language : " + language;

	}
}

والوراثه بالجملة extends ..

بنفس الأمر أردنا موظف جديد من نوع مدير سيرث من الموظف وسوف يحتوي على بيانات المدير الخاصه به مثلا النسبة السنويه وأي شيء يخص المدير :

public class ProjectLeader extends Employee {

	// project leader code
	}

وهكذا ..

اذا كان لديك لبس في OOP في جافا فيمكنك قرائه الموضوع التالي :

دروس في البرمجة الكائنية OOP لجميع اللغات الكائنية

وأي سؤال يرحب به ...

بالتوفيق :) .

تم تعديل هذه المشاركة بواسطة Wajdy Essam في 30 يوليو 2009 في 19:49

http://informatic-ar.com منصة تعليمية عربية في علوم الحاسب والبرمجة

https://moalfat.com  للكتب الالكترونية والكورسات التعليمية

Everything we see now is just an engineering solution based on old science

#8

مشكور اخي الكريم

الان بدات تتضح المعالم اكثر

ولكن لدي تسائل في الصورةالتالية

21415_01249000120.jpg

اتمنى توضح لي هذه الفقرة المشار اليه

#9

هذه دالة بناء Constructor ، أي كلاس يجب أن يحتوي على دالة بناء واحده على الأقل ،، اذا لم تقم بكتابتها سيقوم المترجم بكتابتها نيابه عنك ،، وظيفة هذه الدالة هي تهيئه المتغيرات التي توجد في الكلاس بقيم ابتدائيه ،، هذه الدالة يجب أن تكون باسم الكلاس ولا توجد بها قيمه راجعه return value .

في المثال الذي أشرت له استقبلت الدالة 3 معاملات ، وقامت باسناد كل معامل من هذه المعاملات الثلاثه الى المتغيرات الموجوده في الكلاس ،، وبالتالي عند عمل كائن في الدالة الرئيسية main يجب تمرير 3 قيم (لأن دالة البناء تستقبل 3) وحينها سيتم نقل هذه المتغيرات الثلاثه الى المتغيرات الأعضاء الموجوده في الكلاس ..

ويمكن أن يحتوي الكلاس على أكثر من دالة بناء ، ولكن يجب أن تختلف الدوال من حيث عدد المعاملات المرسلة ونوعها حتى يتم التفرقه بينهم وهذا مفهوم معروف في البرمجه باسم method overloading .

كما أشرت لك أقرأ أكثر عن أساسيات عمل class&object في الجافا فهناك كثير من النقاط يجب فهمها بشكل جيد ،، يمكنك القرائه من كتاب Java How to Program لمعرفه الأساسيات بشكل جيد ،، أو أي كتاب أخر سوف يفي بالغرض..

وأي سؤال يرحب به..

بالتوفيق :) .

http://informatic-ar.com منصة تعليمية عربية في علوم الحاسب والبرمجة

https://moalfat.com  للكتب الالكترونية والكورسات التعليمية

Everything we see now is just an engineering solution based on old science

#10

مرحبا اخي

اشعر اني اتقدم بالفهم معك انا اقرا في الكتاب الذي ذكرت ولكني غير متمكن من اللغة الانجليزية فيفوتني بعض

المعاني

لكن اتمنى ان تستمر بتوضيحاتك

عندي تسائل

قلت (( هذه الدالة يجب أن تكون باسم الكلاس ولا توجد بها قيمه راجعه return value ))

كيف يكون بها قيمة راجعه ممكن تضع مثال عليها ويكون فيها قيمة راجعه اعرف انه لا يصح لكن من اجل ان تتضح فكرة القيمةالراجعه ؟

وقلت (( وبالتالي عند عمل كائن في الدالة الرئيسية main ))

وين الدالة الرئيسية في مثالنا هل تقصد class Employee

واليك هذي الصورة اتمنى توضيح ما فيها ولك جزيل الشكر اخي الكريم

21415_01249161584.jpg

#11

أظن أن هناك سوء تفاهم بالنسبة لما قاله الأخ وجدي بالنسبة للconstructor الذي يقوم المترجم بكتابته.

أول شيء هذا الconstructor يكون بدون arguments

ثانيا فإنه يعطي لكل متغير من متغيراتك a default value

يعني في حالتك الconstructor سيكون بالشكل التالي

public Employee() {

name = null;

idNumber = 0;

salary = 0.0f;

}

مما يعني أن الconstructor الذي كتبته له داعي

يمكنك معرفة الdefault value الخاص بكل صنف من هنا http://java.sun.com/docs/books/tutorial/ja.../datatypes.html

بالنسبة لget الموجودة في بداية أسماء الدوال فهي صيغة متفق عليها لكتابة الدوال getters أي التي تعيد قيمة متغير private في الكلاس، يعني أنت لست مجبرا بكتابتها بتلك الطريقة لكن ذلك مستحسن لأنه يسهل قراءة الكود

مواضيع مشابهة

عدد الزوار حالياً

المتواجدون خلال آخر دقيقتين · يتحدّث كل ٣٠ ثانية

—الإجمالي—أعضاء مسجّلون—زوار بدون تسجيل

جارٍ التحقق من المتواجدين…