Menu
Coddy logo textTech

מבוא לממשקים

חלק מהיחידה תכנות מונחה עצמים במסלול ה-GO של Coddy. שיעור 25 מתוך 107.

ממשק ב-Go מגדיר קבוצה של חתימות מתודות בלי לממש אותן. הוא מתאר מה טיפוס יכול לעשות, ולא איך הוא עושה זאת. כל טיפוס שמממש את כל המתודות בממשק מקיים את הממשק הזה באופן אוטומטי.

כך מגדירים ממשק:

type Speaker interface {
    Speak() string
}

הממשק Speaker הזה דורש מכל טיפוס שמממש אותו שתהיה לו מתודת Speak() שמחזירה מחרוזת. כעת אפשר להשתמש בכל מבנה עם המתודה הזו בכל מקום שבו מצופה Speaker.

type Dog struct {
    Name string
}

func (d Dog) Speak() string {
    return d.Name + " says woof!"
}

type Cat struct {
    Name string
}

func (c Cat) Speak() string {
    return c.Name + " says meow!"
}

גם Dog וגם Cat מממשים את הממשק Speaker, משום שלכל אחד מהם יש מתודה Speak() עם חתימה מתאימה. עכשיו אפשר לכתוב פונקציות שמקבלות כל Speaker:

func MakeSound(s Speaker) {
    fmt.Println(s.Speak())
}

func main() {
    dog := Dog{Name: "Buddy"}
    cat := Cat{Name: "Whiskers"}
    
    MakeSound(dog)  // Buddy אומר הב הב!
    MakeSound(cat)  // Whiskers אומר מיאו!
}

ממשקים מאפשרים לך לכתוב קוד גמיש ושימושי מחדש, שעובד עם כל סוג שעומד בדרישות הממשק, ללא קשר למימוש הבסיסי.

challenge icon

אתגר

קל

בואו נבנה מערכת לתיאור כלי רכב שמדגימה כיצד ממשקים מאפשרים לסוגים שונים לחלוק התנהגות משותפת. תיצרו ממשק שסוגים שונים של כלי רכב יכולים לממש, ואז תשתמשו בו כדי לתאר כל כלי רכב באופן אחיד.

תארגנו את הקוד שלכם בשני קבצים:

  • vehicles.go: הגדירו ממשק Describer עם מתודה אחת בלבד Describe() string. לאחר מכן צרו שתי רשומות (struct) שמממשות את הממשק הזה:
    • Car עם השדות Brand ו-Model (שניהם מסוג מחרוזת)
    • Bicycle עם השדות Type (מחרוזת) ו-Gears (מספר שלם)
    לכל רשומה צריכה להיות מתודת Describe() שמחזירה מחרוזת תיאורית על כלי הרכב.
  • main.go: צרו פונקציה בשם PrintDescription שמקבלת כל ערך שמממש את Describer ומדפיסה את התוצאה של קריאה למתודת Describe() שלו. קראו את פרטי כלי הרכב מהקלט, צרו גם Car וגם Bicycle, והשתמשו בפונקציה שלכם כדי להדפיס תיאור של כל אחד מהם.

הקלט הבא יסופק:

  • שורה 1: מותג המכונית
  • שורה 2: דגם המכונית
  • שורה 3: סוג האופניים
  • שורה 4: מספר ההילוכים (מספר שלם)

מתודות ה-Describe() שלכם צריכות להחזיר מחרוזות בתבניות הבאות:

  • מכונית: [Brand] [Model]
  • אופניים: [Type] bike with [Gears] gears

לדוגמה, עבור Toyota, Camry, Mountain ו-21, הפלט שלכם צריך להיות:

Toyota Camry
Mountain bike with 21 gears

התובנה המרכזית היא שהפונקציה PrintDescription שלכם פועלת עם כל סוג שיש לו מתודת Describe(). היא לא צריכה לדעת אם היא עובדת עם מכונית, אופניים או כל סוג אחר של כלי רכב שתוסיפו בהמשך.

נסו בעצמכם

package main

import (
	"fmt"
)

// TODO: צרו פונקציה בשם PrintDescription שמקבלת כל Describer
// ומדפיסה את התוצאה של קריאה למתודה Describe() שלו

func main() {
	// קראו קלט
	var carBrand string
	var carModel string
	var bicycleType string
	var gears int

	fmt.Scanln(&carBrand)
	fmt.Scanln(&carModel)
	fmt.Scanln(&bicycleType)
	fmt.Scanln(&gears)

	// TODO: צרו Car עם המותג והדגם מהקלט

	// TODO: צרו Bicycle עם הסוג ומספר ההילוכים מהקלט

	// TODO: השתמשו ב-PrintDescription כדי להדפיס את התיאור של המכונית

	// TODO: השתמשו ב-PrintDescription כדי להדפיס את התיאור של האופניים
}
quiz iconבחנו את עצמכם

השיעור הזה כולל חידון קצר. התחילו את השיעור כדי לענות עליו ולעקוב אחרי ההתקדמות.

כל השיעורים ביחידה תכנות מונחה עצמים

תרגלו בעצמכם: קומפיילר Go אונליין