واجهات المناولة في Go
توفر واجهات Go آلية قوية للتجريد. ومع ذلك، يمكن أن يشكل استخدامها بعض التحديات عند التعامل مع واجهات متعددة وأنواع محددة.
فهم واجهات Go
على عكس لغات مثل C و Java، لا يدعم Go المباشر الميراث الطبقي. بدلاً من ذلك، تعمل الواجهات كشكل من أشكال تعدد الأشكال الذي يسمح للأنواع غير المرتبطة بتنفيذ نفس مجموعة الأساليب. وهي لا تحدد أي تفاصيل تنفيذ أساسية.
واجهات متعددة وتنفيذ
في المثال الخاص بك، تواجه مشكلة عند محاولة الوصول إلى تمثيل السلسلة ("String( )") طريقة لمثيل واجهة "البطاقة" الخاصة بك. وذلك لأن الواجهة نفسها لا تحدد هذه الطريقة.
أفضل الممارسات لتصميم الواجهة
لمعالجة هذه المشكلة وتحسين تصميم الواجهة، ضع في اعتبارك ما يلي:
أعلن عن الواجهات المبكرة (إذا لزم الأمر): أعلن فقط عن الواجهات قبل التنفيذ إذا:
نهج بديل
بدلاً من استخدام واجهة لتحديد كل من واجهة برمجة تطبيقات "البطاقة" وتحويل السلسلة، فكر في استخدام التضمين:type Card struct { رقم البطاقة int سلسلة الوجه سلسلة البدلة } // واجهة لسلوك البطاقة المتعلق باللعبة اكتب واجهة GameCard { سلسلة GetFace() سلسلة GetSuit() } // الواجهة المضمنة لتحويل السلسلة اكتب واجهة سترينجر { سلسلة () سلسلة } // تنفيذ كلا الواجهتين على نوع البطاقة func (c *Card) GetFace() سلسلة { العودة ج.الوجه } func (c *Card) GetSuit() string { العودة ج } وظيفة (ج * بطاقة) سلسلة () سلسلة { إرجاع fmt.Sprintf("%s%s ", c.GetFace(), c.GetSuit()) } // الاستخدام: الوظيفة الرئيسية () { // قم بإنشاء مثيل للبطاقة والوصول إلى أساليبها البطاقة := البطاقة {cardNum: 0} fmt.Println(card.GetFace()) fmt.Println(card.GetSuit()) fmt.Println(card.String())type Card struct { cardNum int face string suit string } // Interface for the Card's game-related behavior type GameCard interface { GetFace() string GetSuit() string } // Embedded interface for string conversion type Stringer interface { String() string } // Implement both interfaces on the Card type func (c *Card) GetFace() string { return c.face } func (c *Card) GetSuit() string { return c.suit } func (c *Card) String() string { return fmt.Sprintf("%s%s ", c.GetFace(), c.GetSuit()) } // Usage: func main() { // Create a Card instance and access its methods card := Card{cardNum: 0} fmt.Println(card.GetFace()) fmt.Println(card.GetSuit()) fmt.Println(card.String()) }يسمح لك هذا الأسلوب بتحديد واجهات منفصلة لاهتمامات مختلفة (منطق اللعبة وتحويل السلسلة) وتنفيذها على نفس البنية.
تنصل: جميع الموارد المقدمة هي جزئيًا من الإنترنت. إذا كان هناك أي انتهاك لحقوق الطبع والنشر الخاصة بك أو الحقوق والمصالح الأخرى، فيرجى توضيح الأسباب التفصيلية وتقديم دليل على حقوق الطبع والنشر أو الحقوق والمصالح ثم إرسالها إلى البريد الإلكتروني: [email protected]. سوف نتعامل مع الأمر لك في أقرب وقت ممكن.
Copyright© 2022 湘ICP备2022001581号-3