"إذا أراد العامل أن يؤدي عمله بشكل جيد، فعليه أولاً أن يشحذ أدواته." - كونفوشيوس، "مختارات كونفوشيوس. لو لينجونج"
الصفحة الأمامية > برمجة > كيفية التعامل بشكل فعال مع الواجهات المتعددة وأنواع الخرسانة في لعبة Go؟

كيفية التعامل بشكل فعال مع الواجهات المتعددة وأنواع الخرسانة في لعبة Go؟

تم النشر بتاريخ 2024-11-21
تصفح:552

How to Effectively Handle Multiple Interfaces and Concrete Types in Go?

واجهات المناولة في Go

توفر واجهات Go آلية قوية للتجريد. ومع ذلك، يمكن أن يشكل استخدامها بعض التحديات عند التعامل مع واجهات متعددة وأنواع محددة.

فهم واجهات Go

على عكس لغات مثل C و Java، لا يدعم Go المباشر الميراث الطبقي. بدلاً من ذلك، تعمل الواجهات كشكل من أشكال تعدد الأشكال الذي يسمح للأنواع غير المرتبطة بتنفيذ نفس مجموعة الأساليب. وهي لا تحدد أي تفاصيل تنفيذ أساسية.

واجهات متعددة وتنفيذ

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

أفضل الممارسات لتصميم الواجهة

لمعالجة هذه المشكلة وتحسين تصميم الواجهة، ضع في اعتبارك ما يلي:

  • تجنب إخفاء التنفيذ: بينما قد ترغب في البداية في إخفاء نوع البنية الخاصة بك لفرض التغليف، إلا أن Go غير مُصدَّر ("أحرف صغيرة") تمنع حقول البنية بالفعل التلاعب المباشر بالبيانات الداخلية.
  • إرجاع الأنواع الملموسة: في معظم الحالات، يفضل إرجاع الأنواع الملموسة بدلاً من الواجهات. يؤدي هذا إلى تبسيط تعليمات العميل البرمجية والحفاظ على الوضوح.
  • أعلن عن الواجهات المبكرة (إذا لزم الأمر): أعلن فقط عن الواجهات قبل التنفيذ إذا:

    • تطبيقات متعددة لـ الواجهة موجودة ويقوم العملاء بالتبديل فيما بينهم ديناميكيًا.
    • يستخدم العملاء الواجهة مع وظائف مكتوبة بشكل ثابت أو
  • التخفيف من تأثير التوثيق: يمكن أن يؤثر الإعلان عن واجهات سابقة لأوانها على وضوح التوثيق. استخدم التعليقات التوثيقية لشرح الغرض والقيود الخاصة بأي من طرق الواجهة.

نهج بديل

بدلاً من استخدام واجهة لتحديد كل من واجهة برمجة تطبيقات "البطاقة" وتحويل السلسلة، فكر في استخدام التضمين:

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