מפרטי גישה
חלק מהיחידה תכנות מונחה עצמים במסלול ה-C# של Coddy. שיעור 31 מתוך 70.
משני גישה קובעים מי יכול לראות ולהשתמש בחברי המחלקה שלך. הם הבסיס לכימוס — אחד מעקרונות הליבה של OOP. באמצעות הגבלת הגישה, את/ה מגן/ה על הנתונים שלך ויוצר/ת גבולות ברורים בקוד שלך.
ב-C# יש ארבעה משנהי גישה עיקריים:
public class BankAccount
{
public string AccountHolder; // נגיש מכל מקום
private decimal balance; // רק בתוך מחלקה זו
protected string accountType; // מחלקה זו ומחלקות הנגזרות ממנה
internal int branchCode; // בתוך אותו מכלול
}ניתן לגשת לחברים מסוג public מכל קוד.
אפשר לגשת לחברים מסוג private רק בתוך אותה מחלקה — זוהי רמת הגישה המגבילה ביותר, והיא ברירת המחדל עבור חברי מחלקה.
protected מאפשר גישה מתוך המחלקה עצמה ומכל מחלקה שיורשת ממנה.
internal מגביל את הגישה לקוד בתוך אותה הרכבה (פרויקט).
כשלא מציינים משנה גישה, חברי המחלקה מוגדרים כברירת מחדל כ־private:
class Example
{
int secret; // פרטי כברירת מחדל
}בחירת רמת הגישה הנכונה פירושה חשיפת הדברים הנחוצים בלבד. התחילו עם private והגדילו את הנראות רק כשיש לכם סיבה ברורה. כך תמנעו מקוד אחר להיות תלוי בפרטי המימוש שאולי תרצו לשנות בהמשך.
אתגר
קלבואו נבנה מערכת מאובטחת לניהול פרופילי משתמשים, שתדגים כיצד משנה גישה מגנים על נתונים רגישים וחושפים רק את המידע הדרוש. תיצרו מחלקה שבה לפרטי מידע שונים יש רמות נראות שונות, בהתאם למי שאמור להיות מסוגל לגשת אליהם.
תארגנו את הקוד בשלושה קבצים:
UserProfile.cs: צרו מחלקה בשםUserProfileבמרחב השמותSecurity, שמנהלת פרטי משתמשים עם רמות הגישה המתאימות. בפרופיל צריכים להיות:- מאפיין
publicבשםUsername(מחרוזת) — כל אחד יכול לראות את שם המשתמש - שדה
privateבשםpassword(מחרוזת) — רק המחלקה עצמה אמורה לגשת אליו - שדה
protectedבשםemail(מחרוזת) — המחלקה והמחלקות היורשות ממנה יכולות לגשת אליו - שדה
internalבשםuserId(מספר שלם) — נגיש בתוך אותה הרכבה
publicבשםGetPublicInfo()שמחזירה"User: {Username}". הוסיפו מתודתpublicנוספת בשםValidatePassword(string input), שמחזירהtrueאם הקלט תואם לסיסמה הפרטית, ואחרתfalse.- מאפיין
AdminProfile.cs: צרו מחלקה בשםAdminProfileבמרחב השמותSecurity, שיורשת מ-UserProfile. מחלקה זו מדגימה כיצד חברים מסוגprotectedנעשים נגישים במחלקות יורשות. הבנאי צריך לקבל את אותם ארבעה פרמטרים ולהעביר אותם לבנאי של מחלקת הבסיס. הוסיפו מתודתpublicבשםGetAdminInfo()שמחזירה"Admin: {Username}, Email: {email}"— שימו לב שאפשר לגשת כאן לשדהemailמסוגprotected!Program.cs: בקובץ הראשי, צרו אובייקטים שלUserProfileושלAdminProfileבאמצעות ערכי קלט. הדגימו את רמות הגישה באמצעות קריאה למתודות הציבוריות הזמינות וגישה ישירה לשדה הפנימי (מכיוון שאתם נמצאים באותה הרכבה). הציגו איזה מידע כל סוג משתמש יכול לחשוף.
תקבלו חמישה ערכי קלט:
- שם משתמש
- סיסמה
- כתובת אימייל
- מזהה משתמש (מספר שלם)
- ניסיון סיסמה לאימות
הדפיסו את הפלט בפורמט הבא:
Regular User:
{GetPublicInfo() result}
Internal ID: {userId}
Password valid: {ValidatePassword result}
Admin User:
{GetAdminInfo() result}לדוגמה, אם ערכי הקלט הם alice, secret123, alice@email.com, 1001 ו-secret123, הפלט צריך להיות:
Regular User:
User: alice
Internal ID: 1001
Password valid: True
Admin User:
Admin: alice, Email: alice@email.comשימו לב שהסיסמה נשארת מוסתרת לחלוטין — אפשר רק לאמת אותה, ולעולם לא לשלוף אותה. כתובת האימייל מוגנת, ולכן רק AdminProfile (מחלקה יורשת) יכולה לחשוף אותה. אפשר לגשת ל-userId הפנימי מהקובץ הראשי, מכיוון שהוא נמצא באותה הרכבה. כך נראית אנקפסולציה בפעולה!
נסו בעצמכם
using System;
using Security;
class Program
{
public static void Main(string[] args)
{
// קראו את הקלטים
string username = Console.ReadLine();
string password = Console.ReadLine();
string email = Console.ReadLine();
int userId = Convert.ToInt32(Console.ReadLine());
string passwordAttempt = Console.ReadLine();
// TODO: צרו אובייקט UserProfile עם ערכי הקלט
// TODO: צרו אובייקט AdminProfile עם אותם ערכי קלט
// TODO: הדפיסו "Regular User:"
// TODO: הדפיסו את התוצאה של GetPublicInfo()
// TODO: הדפיסו "Internal ID: " ואחריו את השדה userId (נגיש כי הוא נמצא באותו assembly)
// TODO: הדפיסו "Password valid: " ואחריו את התוצאה של ValidatePassword()
// TODO: הדפיסו "Admin User:"
// TODO: הדפיסו את התוצאה של GetAdminInfo()
}
}
השיעור הזה כולל חידון קצר. התחילו את השיעור כדי לענות עליו ולעקוב אחרי ההתקדמות.
כל השיעורים ביחידה תכנות מונחה עצמים
1יסודות התכנות מונחה העצמים
קבצים חיצונייםמרחבי שמות והנחיותמבוא למחלקות ולאובייקטיםמילת המפתח 'this'מתודות ופרמטריםשדות לעומת מאפייניםבנאיםאתחול אובייקטיםסיכום – מחשבון פשוט4ירושה
תחביר ירושה בסיסית (:)מילת המפתח 'base'מילות המפתח Virtual ו-Overrideמחלקות Sealedמחלקת הבסיס 'object'סיכום – היררכיית עובדים7תכונות מתקדמות
העמסת אופרטוריםאינדקסרים (this[])דריסת ToString()מתודות הרחבהסיכום – רשימה מותאמת אישית2מאפיינים וחברים סטטיים
מאפיינים במימוש אוטומטימאפיינים לקריאה בלבד ולכתיבה בלבדשדות ומתודות סטטייםמחלקות סטטיותחברים עם גוף ביטוי5פולימורפיזם וממשקים
פולימורפיזם בזמן קומפילציה לעומת בזמן ריצהממשק לעומת מחלקה מופשטתממשקים מרוביםממשקים מפורשיםהמרה כלפי מעלה והמרה כלפי מטהחזרה: מחשבון צורות8מושגים מתקדמים בתכנות מונחה עצמים
קומפוזיציה במקום ירושהGenerics (מחלקות ומתודות)נציגים ואירועיםמאפיינים ורפלקציהIDisposable והצהרת usingיסודות הזרקת תלויותתרגלו בעצמכם: קומפיילר C# אונליין