جافا تمديد/تجريد/تنفيذ سؤال
-
22-07-2019 - |
سؤال
لدي ثلاثة فصول (الفئة 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 ، ولكن يمكن أن يكون منطقيًا في ظل ظروف معينة. يبدو أن الإجابتين الأخريين أكثر عقلانية ، لكنهما أحسبوا أن هذا يمكن النظر فيه.