Menu
Coddy logo textTech

מפרטי גישה

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

challenge icon

אתגר

קל

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

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

  • UserProfile.cs: צרו מחלקה בשם UserProfile במרחב השמות Security, שמנהלת פרטי משתמשים עם רמות הגישה המתאימות. בפרופיל צריכים להיות:
    • מאפיין public בשם Username (מחרוזת) — כל אחד יכול לראות את שם המשתמש
    • שדה private בשם password (מחרוזת) — רק המחלקה עצמה אמורה לגשת אליו
    • שדה protected בשם email (מחרוזת) — המחלקה והמחלקות היורשות ממנה יכולות לגשת אליו
    • שדה internal בשם userId (מספר שלם) — נגיש בתוך אותה הרכבה
    הוסיפו בנאי שמקבל username, password, email ו-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()
    }
}
quiz iconבחנו את עצמכם

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

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

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