מתודה מופשטת הנה מתודה וירטואלית אשר אין לה מימוש במחלקה בה היא מוגדרת.
מחלקה נגזרת היורשת מחלקה אבסטרקטית חייבת לממש את כל המתודות האבסטרקטיות המוגדרות במחלקת הבסיס.
מרגע שמחלקה הוגדרה כמחלקה מופשטת, ניתן להגדיר בה מתודות מופשטות (Abstract Methods).
מתודה מופשטת הנה מתודה וירטואלית אשר אין לה מימוש במחלקה בה היא מוגדרת.
מחלקה נגזרת היורשת מחלקה אבסטרקטית חייבת לממש את כל המתודות האבסטרקטיות המוגדרות במחלקת הבסיס.
במידה והמחלקה הנגזרת אינה מממשת את המתודות האבסטרקטיות שלה אשר הוגדרו במחלקת הבסיס תתקבל שגיאת קומפילציה. C# מאפשרת להגדיר גם מאפיינים מופשטים (Abstract Properties).
מתי נעדיף להגדיר מתודה אבסטרקטית על פני מתודה רגילה?
בכל מקרה בו אין צורך או אין היגיון לממש מתודה וירטואלית או מאפיין וירטואלי במחלקת הבסיס משום שאין למימוש שום משמעות נעדיף להגדיר את המתודה או את המאפיין כמופשטים.
תחביר:
abstract class Sample
{ public abstract void FuncName(); public abstract int Num { get; set; }
}
מחלקה נגזרת היורשת מחלקה אבסטרקטית חייבת לממש את כל המתודות האבסטרקטיות המוגדרות במחלקת הבסיס.
במידה והמחלקה הנגזרת אינה מממשת את המתודות האבסטרקטיות שלה אשר הוגדרו במחלקת הבסיס תתקבל שגיאת קומפילציה.
דוגמה (AbstractMethod):
מחלקת הבסיס:
1 : abstractclassBase
2 : {
3 : protectedintnum;
4 : publicBase(intnum)
5 : {
6 : this.num=num;
7 : }
8 : publicabstractvoidPrintMsg();
9 : publicabstractvoidPrint();
10 : publicabstractintNum
11 : {
12 : get;
13 : set;
14 : }
15 : }
המחלקה Base מוגדרת כמחלקה אבסטרקטית (בשורה 1) ולכן ניתן להגדיר בה מתודות ומאפיינים אבסטרקטיים. בשורה 8 ובשורה 9 מוגדרות המתודות האבסטרקטיות ()PrintMsg ו- ()Print, לא ניתן להגדיר להן מימוש, המימוש חייב להיות במחלקה הנגזרת. בשורה 10 מוגדר המאפיין אסטרקטי Num, גם לו אין מימוש וגם לו נהיה חייבים להגדיר מימוש במחלקה הנגזרת.
המחלקה הנגזרת:
1 : classDerived:Base
2 : {
3 : privatestringstr;
4 :
5 : publicDerived(intnum,stringstr)
6 : :base(num)
7 : {
8 : this.str=str;
9 : }
10 : publicoverridevoidPrintMsg()
11 : {
12 : Console.WriteLine("StamMessage1");
13 : }
14 :
15 : publicoverridevoidPrint()
16 : {
17 : Console.WriteLine("num={0}",num);
18 : Console.WriteLine("str={0}",str);
19 : }
20 : publicoverrideintNum
21 : {
22 : get
23 : {
24 : returnbase.num;
25 : }
26 : set
27 : {
28 : base.num=value;
29 : }
30 : }
31 : publicstringStr
32 : {
33 : get
34 : {
35 : returnstr;
36 : }
37 : set
38 : {
39 : str=value;
40 : }
41 : }
42 : }
המחלקה Derived יורשת את מחלקת הבסיס Base (שורה 1), המחלקה Derived חייבת לממש את המתודות האבסטרקטיות ואת המאפיין האבסטרקטי שהוגדרו במחלקת הבסיס.
בשורה 10 נדרוס ונכתוב מימוש למתודה ()PrintMsg, בשורה 15 נדרוס ונכתוב מימוש למתודה ()Print,
ובשורה 20 נספק מימוש למאפיין Num.
Main:
1 : classProgram
2 : {
3 : staticvoidMain(string[]args)
4 : {
5 : Derivedd=newDerived(3,"Metushlach");
6 : d.Print();
7 :
8 : d.PrintMsg();
9 : Baseb=newDerived(10,"BlaBlaBla");
10 : b.Print();
11 : b.PrintMsg();
12 : }
13 : }
פלט: לעיתים קרובות אי מימוש מחדש של מתודה וירטואלית יגרור שגיאה לוגית, משום שבאופן אוטומטי יופעל המימוש של מחלקת הבסיס, בעוד שאי מימוש מתודה מופשטת היה גורר שגיאת קומפילציה, באופן זה על ידי שימוש במתודה מופשטת ניתן להמיר שגיאה לוגית פוטנציאלית (שקשה מאוד לאתרה ולתקנה), בשגיאת קומפילציה קלה לאיתור ותיקון.