הגדרת ממשק
חלק מהיחידה לוגיקה וזרימת התוכנית במסלול ה-GO של Coddy. שיעור 13 מתוך 68.
עכשיו, כשאתה מבין מהן ממשקים מבחינה מושגית, בוא נלמד איך להגדיר ממשק בפועל ב-Go. ממשק מוגדר באמצעות מילת המפתח interface, ואחריה קבוצה של חתימות מתודות המוקפות בסוגריים מסולסלים.
הנה התחביר הבסיסי להגדרת ממשק:
type InterfaceName interface {
MethodName() ReturnType
AnotherMethod(parameter Type) ReturnType
}שימו לב שממשק מכיל רק חתימות של מתודות — שם המתודה, הפרמטרים וסוגי ההחזרה — אך לא מימוש. הממשק אינו מציין כיצד המתודות האלה צריכות לפעול, אלא רק אילו מתודות חייבות להתקיים.
לדוגמה, כך תגדירו ממשק פשוט מסוג Shaper שדורש מכל טיפוס שמממש אותו שתהיה לו מתודה בשם Area:
type Shaper interface {
Area() float64
}הממשק הזה מגדיר חוזה: לכל טיפוס שרוצה להיחשב Shaper חייבת להיות מתודת Area שאינה מקבלת פרמטרים ומחזירה float64. לממשק לא משנה מהו הטיפוס או איך הוא מחשב את השטח — חשוב לו רק שהמתודה קיימת עם החתימה הנכונה.
אתגר
קלבאתגר הזה תתרגלו הגדרה של ממשקים ב-Go באמצעות יצירת מערכת פשוטה של נגן מדיה. תגדירו ממשק שמגדיר חוזה עבור סוגים שונים של התקני מדיה.
תקבלו קלט אחד:
- מחרוזת שמייצגת פעולת מדיה (למשל,
"play","pause"או"stop")
המשימה שלכם היא:
- להגדיר ממשק בשם
MediaPlayerעם שלוש חתימות של מתודות:Play()שמחזירה מחרוזתPause()שמחזירה מחרוזתStop()שמחזירה מחרוזת
- בהתאם לפעולה שהתקבלה בקלט, להדפיס את חתימת המתודה המתאימה מהממשק
MediaPlayerבפורמט:"MediaPlayer interface requires: [MethodName]() string"
פקודת ההדפסה נועדה לשקף את הממשק שהגדרתם למעלה. אתם מתארים איזו חתימת מתודה נדרשת בממשק MediaPlayer עבור הפעולה הנתונה. חשבו על כך כאילו התוכנית שלכם בודקת את חוזה הממשק שלה עצמה ומדווחת עליו.
יש לכתוב את שמות המתודות באות גדולה בתחילתם (כדי שיהיו מיוצאות), מכיוון שהן חלק מהגדרת ממשק. עבור הקלט "play", הדפיסו "MediaPlayer interface requires: Play() string", עבור "pause" הדפיסו "MediaPlayer interface requires: Pause() string", ועבור "stop" הדפיסו "MediaPlayer interface requires: Stop() string".
האתגר הזה מתמקד ברעיון הבסיסי של הגדרת ממשקים באמצעות חתימות של מתודות, ובקביעת החוזה שכל טיפוס שמממש את הממשק חייב לקיים.
נסו בעצמכם
package main
import "fmt"
func main() {
// קראו את הקלט
var action string
fmt.Scanln(&action)
// TODO: הגדירו כאן את הממשק MediaPlayer
// TODO: כתבו למטה את הקוד שלכם לטיפול בפעולה ולהדפסת הפלט הנדרש
// הדפיסו את התוצאה
// זכרו להדפיס בפורמט: "MediaPlayer interface requires: [MethodName]() string"
}השיעור הזה כולל חידון קצר. התחילו את השיעור כדי לענות עליו ולעקוב אחרי ההתקדמות.
כל השיעורים ביחידה לוגיקה וזרימת התוכנית
1בקרת זרימה מתקדמת
switch עם `fallthrough`יציאה מלולאות מקוננותהמשך לולאה מסוימתהצהרת `goto`סיכום – שליטה מתקדמת בלולאות4פרויקט: רשימת משימות פשוטה
הגדרת הפרויקטהוספת משימה2מבנים ושיטות
הגדרת שיטות במבניםמקבלי ערךמקבלי מצביעבחירת מקבליםשיטות לעומת פונקציותסיכום — התנהגות המבנים5מפות לעומק
מפות של Structsמצביעים כערכים במפהבדיקה אם מפות הן nilהשוואת מפותסיכום - מונה תדירות מילים8פרויקט: ניהול מלאי פשוט
סקירת הפרויקטבדיקת המלאיתרגלו בעצמכם: קומפיילר Go אונליין