سؤال

لدي ثلاثة فصول (الفئة A ، الفئة B ، والفئة C).

يستدعي الفئة (أ) مثيلًا لـ B و START ().

يمتد الفئة B الخيط ، لذلك عندما يتم استدعاء Start () ، يتم تنفيذ أي شيء في طريقة التشغيل ().

في سلسلة Run () ، هناك مثيل للفئة C.

هل هناك على أي حال للسماح للطريقة في الفئة C باستدعاء طريقة في الفئة A ، دون إنشاء مثيل جديد من الفئة A؟

نظرًا لأنني لا أستطيع تمديد الفئة A إلى الفئة B (نظرًا لأن "الخيط" تم تمديده بالفعل) ، فلا أعرف كيف سأفعل ذلك.

آسف لكونه غامضًا ، لكن مشروعي يتميز بالكود كثيرًا وهو معقد للغاية لتوفير مثال رمز مباشر.

شكرًا!

هل كانت مفيدة؟

المحلول

لذلك لديك

class A {
 void run()
 {
  new B().start();
 }
}

class B extends Thread {
  public void run(){
    C c = new C();  
    c.do something with A .. }
}

يمكنك تمرير المتصل ، الذي قد يصبح قبيحًا ، حيث يتعين عليك نقل الطريق إلى C إلى C إلى B:

class A {
 void run()
 {
  new B(this).start();
 }
}

class B extends Thread {
  public void run(A a){ 
    C c = new C();
    c.do something(a).. 
  }
}

أو تبسيط ، خاصة إذا لم يكن لدى B و C أي سبب آخر لوجوده:

class A {
 public void run()
 {
   this.do something() ... 
 }
}

نصائح أخرى

هذا هو التبعية الدائرية ، شيء سيء للغاية في OOP في رأيي (المتواضع).

يجب عليك إعادة تشكيل الكود الخاص بك لتوفير فئة مشتركة لـ A و C.

قد تكون أفضل طريقة لبدء الفئة B في التحميل الزائد لاتخاذ معلمة (A ، أو الأفضل من ذلك ، واجهة تنفذها A). ثم يمكن لـ B تخزين ذلك لاسترجاع C (إذا كان فئة داخلية) أو تمريره إلى مُنشئ C ...

تعديل:

على الرغم من أن المعلق الذي ذكره في تجاوز المُنشئ سيعمل ، إلا أنه لا يتناسب مع معلمات السؤال الذي تم صياغته بطريقة بوجهة بالفعل ، لذلك فإن اقتراحي هو زيادة التحميل () مثل هذا:

b.start(A aParam) {
    a=aParam;
    start();
}

هذا الإصدار ليس مؤشر ترابط آمن. يعمل مُنشئ B إذا تم إنشاء إنشاء B بالفعل في كل مرة ، أو إذا تم إنشاء إنشاء C عند بدء B ، فيمكن تمريره إلى مُنشئ C أثناء إنشاءه.

بالمناسبة ، لا يكون توسيع نطاق الخيط جيدًا جيدًا مثل تطبيق Runnable لعدة أسباب.

هناك طريقة أخرى لاستخدام سلوك الخيط في Java وهي تنفيذ Runnable. من المتصور أنه يمكنك تمديد A ، وتنفيذ Runnable ، والاستخدام:

Thread t = new Thread( b )
t.start();

يبدو قبيحًا من وجهة نظر OOP ، ولكن يمكن أن يكون منطقيًا في ظل ظروف معينة. يبدو أن الإجابتين الأخريين أكثر عقلانية ، لكنهما أحسبوا أن هذا يمكن النظر فيه.

مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top