A (num, getNum, f(A a) מדפיסה+משווה num==a.num*2). B יורשת מ-A ומוסיפה f(B b) (חתימה שונה — לא דריסה). C יורשת מ-A ודורסת f(A a) (בודקת instanceof C ושוויון num). Driver.main: y1(מוצהר A, בפועל B), y2(מוצהר B), z1(מוצהר A, בפועל C), z2(מוצהר C).
A (num, getNum, f(A a) מדפיסה+משווה num==a.num*2). B יורשת מ-A ומוסיפה f(B b) (חתימה שונה — לא דריסה). C יורשת מ-A ודורסת f(A a) (בודקת instanceof C ושוויון num). Driver.main: y1(מוצהר A, בפועל B), y2(מוצהר B), z1(מוצהר A, בפועל C), z2(מוצהר C).
public class A {
protected int num;
public A(int n)
{
num = n;
}
public int GetNum()
{
return num;
}
public virtual bool F(A a)
{
Console.WriteLine("F in A");
return num == a.num * 2;
}
}// end of class A
public class B : A {
public B(int n): base(n)
{
}
public bool F(B b)
{
Console.WriteLine("F in B");
return num == b.num;
}
}// end of class B
public class C : A {
public C (int n): base(n)
{
}
public override bool F(A a)
{
Console.WriteLine("F in C");
return a is C && num == ((C)a).num;
}
} //end of class C
public class Driver
{
public static void Main(string[] args)
{
A y1 = new B(10);
B y2 = new B(10);
A z1 = new C(10);
C z2 = new C(10);
(****)
}
}
סעיף א
האם קיימת דריסה (overriding) או העמסה (overloading) של הפעולות? הסבירו את תשובתכם.
סעיף ב
בכל אחד מהסעיפים הבאים השורה (****) תוחלף בשורת קוד משורות הקוד 1-6. כתבו עבור כל אחד מהסעיפים, אם הקוד תקין או לא. אם הקוד תקין, יש לציין מה יהיה הפלט; אם הקוד אינו תקין — יש להסביר למה הוא אינו תקין ולציין את סוג השגיאה (קומפילציה או זמן ריצה). שימו לב שאין קשר בין סעיפים!
- System.out.println(y1.getNum()==((B)z1).getNum());
- System.out.println(y1.f(y2));
- System.out.println(y2.f(y1));
- System.out.println(z1.f(z2));
- System.out.println(z1.f(y1));
- System.out.println(z2.f((C)y2)); (C#: אותן שש שורות, GetNum/F/Console.WriteLine בהתאמה.)
שאלות ותגובות על השאלה
🎓 לא הבנתם משהו? קבלו הסבר נוסף ממרצה לתכנות
שאלו כאן — ותקבלו מענה מוסמך.