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

كيف نستخدم ال composition كبديل لل inheritance

مغلق
بدأه mhewedy في 5 يوليو 2007 · 9 رد · 1,634 مشاهدة · في JavaSE
مشاركة: واتساب X فيسبوك تيليجرام
#1 صاحب الموضوع

السلام عليكم

كلنا يعرف أن ال inheritance يستخدم لعمل extention لل superclass ف ال subclass ، و لكن هذا يكون ف ال compile-time أي قبل تنفيذ ال كود نعلم أن x يرث من y ، هناك طريقه أخري نستطيع بها في ال runtime تحديد من يرث من مَن ، و بهذا تزيد درجة المرونه في البرنامج ، و هي بإستخدام ال composition ، راجع هذا الكود البسيط و أنت تفهم


public void doSomeThing();
}

class C1 implements SuperClass{

private SuperClass sc;

public C1 ( SuperClass sc ){
this.sc = sc;
}

public void doSomeThing (){
sc.doSomeThing();
System.out.println (" inherited by C1 at runtime" );
System.out.println ( "And new funcationality added as well ");
}
}

class C2 implements SuperClass{

public void doSomeThing (){
System.out.print ("Funcationality on C2");
}
}

class C3 implements SuperClass {

public void doSomeThing(){
System.out.print ("Functionality on C3");
}
}

class Test{
public static void main (String[] args){
C2 c2 = new C2();
C3 c3 = new C3();

C1 c1 = new C1 ( c2 );
c1.doSomeThing();

C1 c11 = new C1 ( c3);
c11.doSomeThing();
}
}
interface SuperClass {

و تيجة التشغيل هي :


Funcationality on C2 inherited by C1 at runtime
And new funcationality added as well
Functionality on C3 inherited by C1 at runtime
And new funcationality added as well
daz@compu10:~/java_work/interview$ java Test

اللهم إجعل عملي صالحا ، و إجعله لوجهك خالصا و لا تجعل لأحد غيرك فيه شيئا

آمين

تم تعديل هذه المشاركة بواسطة مبتدئ جافا في 5 يوليو 2007 في 01:43

#2

السلام عليكم ،

حقيقة تستطيع حل أي مشكله تواجهك بعدة طرق ، ولكن انت تبحث عن المثاليه في الحل ..

انت تعرف ان inheritance & composition مختلفان تماماً

عند استخدامك للcomposition لايوجد هناك وراثه ، انت بمثالك استخدمتهم جميعاً ، وهذا الذي جعل تعدد الاشكال يعمل

لكن ماأراده مصمموا تعدد الاشكال ليس هذا ، ماأرادوه أن يستخدموا General type لعمل reduce for changes

بمعنى بغض النظر عن ماهو الاوبجكت سأستخدم نوع عام ، ووقت التنفيذ الjvm ستحدد أي اوبجكت تستدعي ،

واذا اردت اضافة subclass جديد ، فلن أغير كثير بالكود ، فقط سأنشأ الاوبجكت الجديد ، واعمل override للمثد المحتاج مناداتها من هذا السب كلاس

انا إلى الآن مافهمت وش سبب الحركه هذي ، يعني هل واجهتك مشكله معينه ووجدت أنه يجب ان تعمل وراثه و composition لنفس النوع

موضوع جميل تشكر عليه أستاذي الفاضل ،

#3

شكرا لك يا مبتدئ جافا يبدو انك محترف وهذا ظاهر من مشاركاتك

حقيقى ..

انا مبرمج دوت نت واعرف جافا قليلا لكنى لن انقل الى جافا الا عندما اجد IDE لجافا يستطيع بناء برامج بواجهات رسوميه(GUI) على لينكس ويعمل جيدا ك vs.net على ويندوز

انا اعرف netbeans لكن لم اجربه على لينكس فقط جربته على ويندوز لانى لا اعرف اقوم بتنصيبه على لينكس

شكرا

تم تعديل هذه المشاركة بواسطة macnux في 5 يوليو 2007 في 22:25

#4
اقتباس
انا إلى الآن مافهمت وش سبب الحركه هذي ، يعني هل واجهتك مشكله معينه ووجدت أنه يجب ان تعمل وراثه و composition لنفس النوع

الحق لا، لكنها طريقه مرنه و أردت أن أشارك ، إنها ال decorator pattern

هل تعرف أن ال io في ال java تتبع هذه الطريقه .

فمثلا لو لم تستخدم في ال io ، فيصبح شكل ال APIs هكذا :

BufferedFileInputStream
BufferedFileReader
LineNumberFileInputStream
LineNumberFileReader
...
....

و بالتالي فستصبح ال APIs كبيره جدا، ولذا إتباع هذه الطريقه يقلل من الفئات و يجعل ال APIs أكثر مرونا ، و .. و ... و ..

الأخ macnux

اقتباس
يبدو انك محترف

حاشا لله ، فأنا لازلت في طور التعلم، لكن ما أتعلمه أحب أن أنشره

ال نيتبينز ع اللينوكس جميل جدا و به (GUI و ممكن تجرب jdeveloper خفيف و جميل

#5

ياسلام ،

حقيقة كلمت نفسي في ردي السابق على إن كودك هو تطبيق لpattern معين ( خاصة بعدما وجدت بأنها ناجحه بمختلف الطرق ) ، ولكن سرعان ماتلاشت فكرتي ونسيتها

شكراً جزيلاً

#6

بل أنت شكرا على ردك

#7

السلام عليكم

روعة الباترن هادا

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

شكراُ جزيلا لك أخ مبدئ جداً

الله معكم

حزمة المحرك الإصدارة 0.8

أي أحد يجد أني ظلمته فليراسلني

وبإذن الله لو كان له حق سيأخذه

728x90.png

#8

أعتقد أيضا أنه يمكنك من الوراثه من الفئات التي لا تسمح بذلك ، مثل الفئه String

مثال :

1
 2  package org.daz;
 3
 4  public class MutableString {
 5
 6		  private String str;
 7
 8		  public MutableString ( String str ){
 9				  this.str = str;
10		  }
11
12		  public MutableString ( char[] arr ){
13				  str = new String ( arr);
14		  }
15
16		  // reset of constructors goes here ..
17		  // ..
18		  // ....
19
20		  public char charAt ( int index ){
21				  return str.charAt ( index);
22		  }
23
24		  public int length (){ return str.length(); }
25
26		  public int codePointAt ( int index ){ return str.codePointAt( index); }
27
28		  public String toString(){
29				  return str.toString();
30		  }
31
32		  //reset of String methods goes here..
33		  //...
34		  //....
35
36		  /**
37		   *  This is the new method of the new class
38		   */
39
40		  public void setValue (String sValue ){
41				  str = sValue;
42		  }
43
44  }

و هنا مثال عليها :

1
 2  import org.daz.MutableString;
 3
 4  public class UseMutableString {
 5
 6		  public static void main (String[] args ){
 7				  MutableString mstr = new MutableString("Mohammed");
 8				  System.out.println ( mstr.toString() );
 9				  mstr.setValue ( "NewValue");
10				  System.out.println ( mstr.toString());
11		  }
12  }
#9

شكراً لك أخي مبتدئ جداً

فهذه نقطة تاهت عن بالي

كل الود والاحترام لك

أخوك علاء

حزمة المحرك الإصدارة 0.8

أي أحد يجد أني ظلمته فليراسلني

وبإذن الله لو كان له حق سيأخذه

728x90.png

#10

شكرا لك أخي في الله علاء

هذا الموضوع مغلق.

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