#C| מיון אובייקטים במערך - תכנות - HWzone פורומים
עבור לתוכן
  • צור חשבון

#C| מיון אובייקטים במערך


bdoron

Recommended Posts

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

אז יצרתי 4 מחלקות שיורשות ממחלקת אב שקראתי לה shape כאשר במחלקת האב גם יצרתי מתודה אבסטרקטית לחישוב שטח, מימשתי אותה בכל מחלקה יורשת בהתאם לצורה.

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

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

הבעיה היא שאני לא יודע איזה צורה הcompareTo מקבל, אני לא יכול לדעת את סדר הצורות במערך האובייקטים

אז בעצם שאלתי היא האם אני צריך לעשות 4 תנאים שבכל תנאי אני בעצם אומר אם האובייקט ריבוע תעשה ... אם האובייקט עיגול תעשה ... אם האובייקט משולש תעשה ... אם האובייקט ריבוע תעשה ....

נשמע הגיוני?

או שיש דרך אחרת.. אשמח לייעוץ

קישור לתוכן
שתף באתרים אחרים

השתמשתי בה המתודה האבסטרקטית ממומשת בכל מחלקה יורשת.

זה מחלקה לדוגמא:


{




public override double CalcArea()
{
double area = (X * Y)/2;// גובה כפול אורך לחלק ל2


return area;
}
public int CompareTo(object other)
{
Ellipse e = null;
Rectangle r = null;
Circle c = null;
int a, b;
if (other is Ellipse)
{
e = (Ellipse)other;
a = Convert.ToInt32(this.CalcArea());
b = Convert.ToInt32(e.CalcArea());
return a - b;
}
if (other is Rectangle)
{
r = (Rectangle)other;
a = Convert.ToInt32(this.CalcArea());
b = Convert.ToInt32(r.CalcArea());
return a - b;
}
if (other is Circle)
{
c = (Circle)other;
a = Convert.ToInt32(this.CalcArea());
b = Convert.ToInt32(c.CalcArea());
return a - b;
}
return 1;
}


}
     class Triangle:Shape,IComparable

מימשתי גם את הcompareTo מה דעתכם?

קישור לתוכן
שתף באתרים אחרים

נראה לי שלא הבנת נכון את הקונספט של מתודה אבסטרקטית. הרעיון הוא שאם המחלקה Shape מגדירה מתודה אבסטרקטית CalcArea, אז אם יש לך משתנה s מטיפוס Shape אז אתה יכול לבצע ()s.CalcArea. הירושה תדאג לכך שהפונקציה המתאימה היא זו שתקרא (כלומר אם הטיפוס האמיתי של s הוא Triangle אז תתבצע ה-CalcArea של Triangle, אם הטיפוס האמיתי הוא Rectangle אז תקרא הפונקציה של Rectangle וכן הלאה). ככה לא צריך לבצע המרה לטיפוס של הצורה הספציפית.

חוץ מזה, מחלקות אבסטרקטיות גם יכולות להכיל מתודות שאינן אבסטרקטיות (והן יכולות להשתמש בשאר המתודות של המחלקה, כולל אלו שכן אבסטרקטיות), והן יכולות גם לממש ממשקים.

קישור לתוכן
שתף באתרים אחרים

עשיתי מה שאמרת וקבלתי אקספשן, מה לא עשיתי בסדר?


{
/*
Ellipse e = null;
Rectangle r = null;
Circle c = null;


if (other is Ellipse)
{
e = (Ellipse)other;
return Convert.ToInt32(this.CalcArea()) - Convert.ToInt32(e.CalcArea());
}
if (other is Rectangle)
{
r = (Rectangle)other;
return Convert.ToInt32(this.CalcArea()) - Convert.ToInt32(r.CalcArea());
}
if (other is Circle)
{
c = (Circle)other;
return Convert.ToInt32(this.CalcArea()) - Convert.ToInt32(c.CalcArea());
}
return 1;
* /
* */
Shape s = null;
s = obj;
return Convert.ToInt32(this.CalcArea()) - Convert.ToInt32(s.CalcArea());


}
   public int CompareTo(Shape obj)

קישור לתוכן
שתף באתרים אחרים

לא עשית מה שהוא אמר. פשוט תחשב את obj.calcArea ותראה אם הוא גדול יותר מ- this.caclArea.

למעשה אתה יכול פשוט להחזיר את ההפרש בין השטח של this לבין השטח של obj (אתה לא יודע מאיזה טיפוס הוא וגם לא אכפת לך)

קישור לתוכן
שתף באתרים אחרים

ארכיון

דיון זה הועבר לארכיון ולא ניתן להוסיף בו תגובות חדשות.

×
  • צור חדש...