كيفية تنفيذ واجهات متعددة بتوقيعات طريقة متطابقة في حزم مختلفة
لنفترض أنك بحاجة إلى تنفيذ واجهات محددة في حزم منفصلة مع توقيعات طريقة متعارضة . قد يكون هذا أمرًا صعبًا، لكن Go يوفر حلاً.
دعونا نفكر في مثال:
في الحزمة أ:
package A type Doer interface { Do() string } func FuncA(doer A.Doer) { // Use doer.Do() here to implement functionality }
في الحزمة ب:
package B type Doer interface { Do() string } func FuncB(doer B.Doer) { // Use doer.Do() here to implement functionality }
في الحزمة الرئيسية الخاصة بك:
package main import ( "path/to/A" "path/to/B" ) type C int // C implements both A.Doer and B.Doer, but the implementation of Do() aligns with A. func (c C) Do() string { return "C implements both A and B" } func main() { c := C(0) A.FuncA(c) // Acceptable as C implements A.Doer B.FuncB(c) // Error, as the Do() implementation in C doesn't meet B.Doer requirements }
الحل:
لحل هذا التعارض، يقدم Go نهجًا موجزًا:
if _, ok := obj.(A.Doer); ok { }
يسمح لك هذا بالتحقق مما إذا كان الكائن (من نوع الواجهة) يتوافق مع نوع واجهة آخر (على سبيل المثال، A.Doer) في وقت التشغيل.
ومع ذلك، يسلط البروتوكول الاختياري الضوء على تعقيد إضافي : المنطق المطبق لـ Do() في الحزمة A والحزمة B مختلف. لمعالجة هذه المشكلة، قم بإنشاء أغلفة حول الكائن الخاص بك:
من خلال تنفيذ أغلفة مميزة، يمكنك التحكم في الطريقة التي سيتم استخدامها بناءً على نوع الواجهة المتوقعة (A.Doer أو B.Doer). وهذا يلغي الحاجة إلى أسلوب Do() واحد على كائن C الأصلي، والذي قد يواجه صعوبة في تنفيذ كلا المنطقين.
تنصل: جميع الموارد المقدمة هي جزئيًا من الإنترنت. إذا كان هناك أي انتهاك لحقوق الطبع والنشر الخاصة بك أو الحقوق والمصالح الأخرى، فيرجى توضيح الأسباب التفصيلية وتقديم دليل على حقوق الطبع والنشر أو الحقوق والمصالح ثم إرسالها إلى البريد الإلكتروني: [email protected]. سوف نتعامل مع الأمر لك في أقرب وقت ممكن.
Copyright© 2022 湘ICP备2022001581号-3