הגדרת ממשק
חלק מהיחידה לוגיקה וזרימת התוכנית במסלול ה-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, וזה בסדר: Go מקמפלת ממשק גם כשאף טיפוס לא מממש אותו. פקודות ההדפסה פשוט מציגות את חתימת המתודה שהממשק שלכם דורש עבור פעולת הקלט. בשיעור הבא תיצרו טיפוס שמממש את 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 אונליין