נתונות המחלקות A, B, C הבאות:
נתונות המחלקות A, B, C הבאות:
language_variants: codeBlock:
public class A
{
private static int countA = 0;
protected int x;
public A()
{
countA++;
this.x = 0;
}
public A(int x)
{
countA++;
this.x = x;
}
public override string ToString()
{
return "A:"+this.x;
}
public virtual int DoIt(int z)
{
return this.x * z;
}
public static int GetCount(){ return countA; }
}// end of class A
public class B : A
{
protected int y;
private static int countB = 0;
public B(int y)
{
this.y = y;
countB++;
}
public B(int x, int y):base(x)
{
countB++;
this.y = y;
}
public override string ToString()
{
return "B:"+base.ToString ()+":"+this.y;
}
public static new int GetCount(){return countB;}
public override int DoIt(int z)
{
return base.DoIt(z) + this.y;
}
} //end of class B
public class C : B
{
private A myA;
private static int countC = 0;
public C(int x, int y): base(x, y)
{
this.myA = new A(x+y);
countC++;
}
public static new int GetCount(){return countC;}
public override string ToString()
{
return "C:"+base. ToString()+" ["+this.myA+"]";
}
}// end of class C
semanticDeltaNote: TWO real (not cosmetic) C#-only language mechanics on display here, both directly relevant to this exam corpus's known trap class: (1)
ToString()needsoverridestarting IN CLASS A ITSELF (not just in B/C) because it overridesSystem.Object.ToString()which is already virtual on every C# class by inheritance — verified present and correctly placed (public override string ToString()in A, B, and C).DoItneeds the more familiar pattern:virtualdeclared in A,overridein B (C inherits B's override without redeclaring) — also verified present and correctly placed, so polymorphicarr[k].DoIt(k+1)dispatch (part ה) will resolve to the runtime type's override in C#, matching Java's implicit-override behavior fordoIt. (2)GetCount()is STATIC, so it cannot be virtual/overridden at all — C# instead requires thenewkeyword in B and C to explicitly hide the base class's same-named static member (public static new int GetCount()), verified present in both B and C; Java requires no equivalent keyword for static-method hiding. This is a DISTINCT trap from virtual/override (hiding vs. overriding) and matters for part ג (A.GetCount()/B.GetCount()/C.GetCount()are static calls through the class name, unaffected by hiding-vs-overriding) vs part ה (arr[k].DoIt(k+1)is an instance call through a runtime-polymorphic reference, where virtual/override IS the operative mechanism). Flag for Stage-4 solve: run the code-oracle independently per language, do not assume trace-transfer, and do not conflate the hiding trap (GetCount) with the overriding trap (DoIt/ToString) when writing evaluation guidelines.
ציירו תרשים UML שמייצג את הקשרים בין המחלקות A, B, C. יש לסמן ירושה באמצעות חץ והכלה באמצעות סימן.
נתון קטע הקוד הבא, בפעולה הראשית במחלקה אחרת. עקבו אחרי ביצוע קטע הקוד. יש לצייר את כל העצמים שנוצרו ולציין את התכונות שלהם.
setupCode:
A[] arr = new A[5];
arr[0] = new A(13);
arr[1] = new B(5, 10);
arr[2] = new C(2, 7);
arr[3] = new C(3, 3);
arr[4] = new B(5);
לקוד של סעיף ב' התוסף הבא, רשמו מה יהיה הפלט בהתאם:
codeBlock:
Console.WriteLine("A objects: " + A.GetCount());
Console.WriteLine("B objects: " + B.GetCount());
Console.WriteLine("C objects: " + C.GetCount());
לקוד של סעיף ב' התוסף הבא, רשמו מה יהיה הפלט:
codeBlock:
for (int k=0; k < arr.Length; k++)
Console.WriteLine(arr[k]);
codeBlock:
for (int k=0; k <arr.Length; k++)
if(arr[k] is B)
Console.WriteLine(arr[k].DoIt(k+1));
שאלות ותגובות על השאלה
🎓 לא הבנתם משהו? קבלו הסבר נוסף ממרצה לתכנות
שאלו כאן — ותקבלו מענה מוסמך.