חקר שיטות וירטואליות ומופשטות ב- C #

שפת התכנות C # מספקת תמיכה הן בשיטות וירטואליות והן בשיטות מופשטות, שלכל אחת מהן יתרונות ברורים. אתה משתמש בשיטות וירטואליות ליישום כריכה מאוחרת, ואילו שיטות מופשטות מאפשרות לך להכריח את מחלקות המשנה מהסוג לבטל את השיטה במפורש. בפוסט זה אציג דיון בשיטות וירטואליות ומופשטות כאחד ומתי יש להשתמש בהן.

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

MSDN קובע: "מילת המפתח הווירטואלית משמשת לשינוי שיטה, מאפיין, אינדקס או הצהרת אירוע ולאפשר לעקוף אותה במחלקה נגזרת."

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

public class Base

{

public virtual void Test()

{

Console.WriteLine("This is the base version of the virtual method");

}

}

public class Derived : Base

{

public override void Test()

{

Console.WriteLine("This is the derived version of the virtual method");

}

}

שיטת Test () מוכרזת כווירטואלית במחלקת הבסיס והיא נעקפת במחלקה הנגזרת. שים לב כיצד משתמשים במילת המפתח הווירטואלית כדי להכריז על השיטה כווירטואלית במחלקת הבסיס. אין צורך במילת המפתח הווירטואלית כאשר אתה עוקף את השיטה הווירטואלית בכיתה נגזרת.

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

class Program

{

static void Main()

{

Base baseObj1 = new Base();

baseObj1.Test();

Base baseObj2 = new Derived();

baseObj2.Test();

}

}

שים לב ששני מופעים של מחלקת Base נוצרים - baseObj1 ו- baseObj2. במקרה הראשון, אובייקט הייחוס בשם baseObj1 מתייחס למופע של מחלקת הבסיס. במקרה השני, אובייקט הייחוס בשם baseObj2 מתייחס למופע של המחלקה הנגזרת. בעת ביצוע הקוד, השיחה הראשונה לשיטה הווירטואלית תציג את המסר "זו הגרסה הבסיסית של השיטה הווירטואלית" במסוף. במקרה השני תוצג ההודעה "זו הגרסה הנגזרת של השיטה הווירטואלית". מדוע ההבדל הזה?

במקרה הראשון, סוג של אובייקט ההפניה baseObj1 נחשב - מכיוון שהוא מסוג Base, הגרסה הבסיסית של השיטה הווירטואלית תיקרא. במקרה השני, ההקשר של אובייקט ההפניה baseObj2 ייחשב ומכאן התוצאה.

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

שימוש אופייני בשיטה מופשטת הוא לכפות על עקיפת שיטות ToString () או שווה (). קטע הקוד הבא ממחיש כיצד מכריזים על שיטות מופשטות במחלקה מופשטת בשם EntityBase.

public abstract class EntityBase

{

public abstract override string ToString();

public abstract override bool Equals(object obj);

}

public class Customer : EntityBase

{

//Implementation code for the abstract methods

}

מחלקת EntityBase היא סוג הבסיס לכל הישויות - מחלקת ישויות הלקוחות מרחיבה מחלקה זו ומספקת יישום לשיטות המופשטות. למעשה, כל מחלקות היישויות יספקו יישום משלהן של השיטות ToString () ו- Equals (). אין צורך ביישום ברירת מחדל לשיטות אלה בכיתת הבסיס ולכן הן מסומנות כמופשטות. לכן, עקיפת השיטה נאכפת על ידי הכרזת השיטה כמופשטת במחלקת הבסיס ששמה EntityBase.