PDA

View Full Version : سوال: virtual کردن یک متد و استفاده در کلاس فرزند



Developer Programmer
شنبه 25 آبان 1387, 12:28 عصر
فرض کنین یه کلاس به اسم Shape داریم و می خوایم دو تا متد واسه محاسبه محیط و مساحت رو تعریف کنیم و اجازه بدیم فرزندها خودشون اون متد رو override کنن.

1) با توجه به اینکه واسه محاسبه مساحت دایره، فقط به یه شعاع احتیاج داریم ، واسه مساحت مستطیل به طول و عرض و واسه مثلت، به ارتفاع و قاعده...آیا میشه متد مساحت رو در کلاس Shape بدون پارامتر تعریف کرد و اجازه داد کلاس فرزند (مثل Circle) خودش پارامترهای دلخواه رو کم و زیاد کنه ؟

2) آیا میشه بدنه متد Virtual رو خالی گذاشت و اجازه داد کلاس فرزند اونرو از اول بنویسه؟


class Shape
{
// non-primitive data type
public enum eColor
{
white = 1,
blue,
green,
red
};

//a private varible to read/write property color
private eColor fColor = eColor.white;

//constructor with a given color name
public Shape(eColor color)
{
fColor = color;
}

// overloaded constructor with default color name
public Shape()
{
fColor = eColor.white;
}

/*
protected virtual float Mohit();
protected virtual float Masahat();
*/
}


private void Form1_Load(object sender, EventArgs e)
{
Shape myShape = new Shape(Shape.eColor.red);
}

Developer Programmer
شنبه 25 آبان 1387, 21:18 عصر
یه کلاس Circle تعریف کردم و محیط و مساحت رو بر اساس پراپرتی شعاع(radius) محاسبه میکنم
اما تغییر مقدار شعاع به کلاس اعمال نمیشه !


class Circle: Shape
{
// fields
private float fRadius;

//property
public float Radius
{
get
{
return fRadius;
}
set
{
fRadius = Radius;
}
}

public Circle(float Radius, eColor color)
{
base.color = this.color;
fRadius = Radius;
}

public override float Perimeter()
{
return ( 3.1415f * 2 * fRadius );
}

public override float Space()
{
return (3.1415f * fRadius * fRadius );
}


private void button1_Click(object sender, EventArgs e)
{
Circle myCircle = new Circle(1.0f, Shape.eColor.green);

// تغییرات اعمال نمی شه
myCircle.Radius = 10;
// تغییرات اعمال نمی شه
MessageBox.Show(myCircle.color.ToString(), " ");

Masoud_TB
دوشنبه 27 آبان 1387, 13:00 عصر
سلام
دوست عزیز شما مي تونين به اين صورت کلاس هاي خودتون را تعريف کنيد:


public abstract class Shape
{
public Color Color;
public abstract float Masahat();
public abstract float Mohit();
}

دليلي که به صورت abstract تعريف کردم اينه که در واقع کسي از Shape استفاده نمي کنه و همه از کلاس هايي که از Shape به ارث رفته اند استفاده خواهند کرد:



public class Circle : Shape
}
public float Radius;
public override float Mohit()
{
return 0;
// فرمول مورد نظر را اينجا بنويس
}
public override float Masahat()
{
return 0;
// فرمول مورد نظر را اينجا بنويس
}
{


حالا به سادگي از کلاس Circle استفاده مي کنيم:


void Main()
{
Circle rc = new Circle();
rc.Color = Color.Red;
rd.Radius = 21;
Console.WriteLine("Masahat:{0}",rd.Masahat();
Console.WriteLine("Mohit:{0}",rd.Mohit());
}