מימוש ממשק
חלק מהיחידה לוגיקה וזרימת התוכנית במסלול ה-GO של Coddy. שיעור 14 מתוך 68.
עכשיו, כשאתה יודע איך להגדיר ממשק, בוא נלמד איך טיפוסי Go מממשים אותם בפועל. הדבר החשוב ביותר להבין הוא ש-Go משתמשת במימוש משתמע — אין צורך במילת מפתח או בהצהרה מיוחדת.
אם לטיפוס יש את כל המתודות שממשק דורש, הוא מקיים את הממשק באופן אוטומטי. אין צורך לציין במפורש שהטיפוס שלך מממש את הממשק — Go מזהה זאת בעצמו.
כך זה עובד עם הממשק Shaper מהשיעור הקודם:
type Circle struct {
Radius float64
}
func (c Circle) Area() float64 {
return 3.14159 * c.Radius * c.Radius
}מכיוון שלטיפוס Circle יש מתודה Area() שמחזירה float64, הוא מממש באופן אוטומטי את הממשק Shaper. אין צורך להצהיר על הקשר הזה במפורש - Go מזהה אותו על סמך התאמה של חתימת המתודה.
הגישה המרומזת הזו הופכת את הממשקים של Go לגמישים להפליא. כל טיפוס קיים יכול לממש ממשק חדש כל עוד יש לו את המתודות הנדרשות, אפילו אם הממשק נוצר אחרי כתיבת הטיפוס.
אתגר
קלבאתגר הזה תתרגלו מימוש של ממשק באמצעות יצירת מערכת פשוטה של כלי רכב. תיצרו מבנה Car שמממש באופן אוטומטי ממשק Vehicle באמצעות המימוש המרומז של Go.
תקבלו שתי קלטים:
- מחרוזת שמייצגת את יצרן הרכב (לדוגמה,
"Toyota") - מחרוזת שמייצגת את מהירות הרכב בקמ״ש (לדוגמה,
"120")
המשימה שלכם היא:
- להגדיר ממשק
Vehicleעם חתימת מתודה אחת:GetInfo()שמחזירה מחרוזת - להגדיר מבנה
Carעם שני שדות:Brand(מחרוזת) ו-Speed(מספר שלם) - לממש את המתודה
GetInfo()עבור המבנהCar, כך שתחזיר מחרוזת בפורמט:"Brand: [brand], Speed: [speed] km/h" - לנתח את הקלטים כדי ליצור מופע של
Car - לקרוא למתודה
GetInfo()ולהדפיס את התוצאה
זכרו שב-Go, המבנה Car יממש באופן אוטומטי את הממשק Vehicle, מכיוון שיש לו את המתודה הנדרשת GetInfo() עם החתימה הנכונה. אין צורך להצהיר במפורש ש-Car מממש את Vehicle — Go מזהה את הקשר הזה באופן מרומז.
נסו בעצמכם
package main
import (
"fmt"
"strconv"
)
// TODO: 1. הגדירו את הממשק Vehicle עם המתודה GetInfo() שמחזירה string
// TODO: 2. הגדירו את המבנה Car עם השדות Brand (string) ו-Speed (int)
// TODO: 3. ממשו את המתודה GetInfo() עבור Car
func main() {
// קראו את הקלט
var brand string
var speedStr string
fmt.Scanln(&brand)
fmt.Scanln(&speedStr)
// המירו את מחרוזת המהירות למספר שלם
speed, _ := strconv.Atoi(speedStr)
// TODO: 4. צרו מופע של Car באמצעות brand ו-speed, ואז קראו ל-GetInfo()
result := "" // החליפו שורה זו במימוש שלכם
_ = brand
_ = speed
// הדפיסו את התוצאה
fmt.Println(result)
}השיעור הזה כולל חידון קצר. התחילו את השיעור כדי לענות עליו ולעקוב אחרי ההתקדמות.
כל השיעורים ביחידה לוגיקה וזרימת התוכנית
1בקרת זרימה מתקדמת
switch עם `fallthrough`יציאה מלולאות מקוננותהמשך לולאה מסוימתהצהרת `goto`סיכום – שליטה מתקדמת בלולאות4פרויקט: רשימת משימות פשוטה
הגדרת הפרויקטהוספת משימה2מבנים ושיטות
הגדרת שיטות במבניםמקבלי ערךמקבלי מצביעבחירת מקבליםשיטות לעומת פונקציותסיכום — התנהגות המבנים5מפות לעומק
מפות של Structsמצביעים כערכים במפהבדיקה אם מפות הן nilהשוואת מפותסיכום - מונה תדירות מילים8פרויקט: ניהול מלאי פשוט
סקירת הפרויקטבדיקת המלאיתרגלו בעצמכם: קומפיילר Go אונליין