مشخصات مقاله
-
3076
-
4.0
-
5753
-
1
-
1
یک عضو درونی کلاس از گونه داده ای خودش (Class as a Member of itself)
می توان نمونه ای از یک کلاس را به عنوان آرگومان به یکی از متدهای خود آن کلاس فرستاد. برای این منظور، آرگومان را مثل هر کلاس دیگری ارسال می کنید.
می توان نمونه ای از یک کلاس را به عنوان آرگومان به یکی از متدهای خود آن کلاس فرستاد. برای این منظور، آرگومان را مثل هر کلاس دیگری ارسال می کنید.
مثال:
public class Point
{
internal int x;
internal int y;
public void Equivalent(Point Same)
{
}
}
حال، می توانید هر کاری که می خواهید در بدنه ی متد انجام دهید. همچنین، می توانید آرگومان را مورد استفاده قرار دهید. حال در صورت استفاده از آرگومان گفته شده، لازم است به خاطر داشته باشید، همگی (دیگر) اعضای کلاس از طریق آرگومان قابل دسترسی هستند. ساده ترین روش استفاده از آرگومان، تخصیص (هر یک از) مقادیر آن به عضو های معادل و مربوط در کلاس است.
مثال:
public class Point
{
internal int x;
internal int y;
public void Equivalent(Point Same)
{
this.x = Same.x;
this.y = Same.y;
}
}
هنگام فراخوانی متد، لازم است نمونه ای از کلاس به آن ارسال کنید. در وهله ی اول کلاس مورد نظر را ایجاد و تعریف می کنیم، بعد آن را ارسال می کنیم.
مثال:
using System;
public class Point
{
internal int x;
internal int y;
public void Equivalent(Point Same)
{
this.x = Same.x;
this.y = Same.y;
}
}
public class Program
{
private static void ShowPoint(Point pt)
{
Console.Write("Point Coordinates: ");
Console.WriteLine("A({0}، {1})"، pt.x، pt.y);
}
static int Main(string[] args)
{
Point pt = new Point();
pt.x = 4;
pt.y = 6;
ShowPoint(pt);
Point One = new Point();
One.Equivalent(pt);
ShowPoint(One);
Console.ReadKey();
return 0;
}
}
نتیجه
Point Coordinates: A(4، 6) Point Coordinates: A(4، 6) Press any key to continue...
به جای اینکه اول کلاس را تعریف و مقداردهی اولیه کنید، می توانید نمونه ای از کلاس مورد نظر را داخل پرانتز های متد فراخوان (calling method) ایجاد کنید. البته برای این منظور نیاز به سازنده ای (constructor) دارید که مقادیر فیلد های کلاس مربوط را مشخص کرده تا آرگومان به تناسب (با مقدار مناسب) مقداردهی اولیه شود.
مثال:
using System;
public class Point
{
internal int x;
internal int y;
public Point()
{
}
public Point(int XCoord، int YCoord)
{
this.x = XCoord;
this.y = YCoord;
}
public void Equivalent(Point Same)
{
this.x = Same.x;
this.y = Same.y;
}
}
public class Program
{
private static void ShowPoint(Point pt)
{
Console.Write("Point Coordinates: ");
Console.WriteLine("A({0}، {1})"، pt.x، pt.y);
}
static int Main(string[] args)
{
Point pt = new Point();
pt.x = 4;
pt.y = 6;
ShowPoint(pt);
Point One = new Point();
One.Equivalent(new Point(-3، 2));
ShowPoint(One);
Console.ReadKey();
return 0;
}
}
به جای متد رسمی (formal method)، می توان سازنده ای از کلاس را برای ارسال نمونه ای از همان کلاس به کار برد. حال می توانید در سازنده، آرگومان را بر اساس نیازتان به کار ببرید (نظر به اینکه تمامی اعضای کلاس در دسترس هستند).
مثال:
public class Point
{
internal int x;
internal int y;
public Point()
{
}
public Point(int XCoord، int YCoord)
{
this.x = XCoord;
this.y = YCoord;
}
public Point(Point Same)
{
this.x = Same.x;
this.y = Same.y;
}
}
هدف ما از ارسال یک کلاس به متدهای خود همان کلاس پیدا کردن معادل آن نیست. زبان C# در حقیقت .NET Framework، با استفاده از متد توکار Equals() ترتیب فرایند بالا را می دهد. در عوض، می توان متدی ایجاد کرد که نمونه ای از همان کلاس را می گیرد ولی نمونه ی نام برده را اصلاح می کند. برای مثال، شاید بخواهیم برای کلاس Point، point جدیدی ایجاد کنیم که به اندازه ی یک واحد از شی Point موجود فاصله داشته باشد.
using System;
public class Point
{
internal int x;
internal int y;
public Point()
{
}
public Point(int XCoord، int YCoord)
{
this.x = XCoord;
this.y = YCoord;
}
public void Equivalent(Point Same)
{
this.x = Same.x;
this.y = Same.y;
}
public void CreatePointOneUnitAway(Point AddUnit)
{
this.x = AddUnit.x + 1;
this.y = AddUnit.y + 1;
}
}
public class Program
{
private static void ShowPoint(Point pt)
{
Console.Write("Point Coordinates: ");
Console.WriteLine("A({0}، {1})"، pt.x، pt.y);
}
static int Main(string[] args)
{
Point pt = new Point();
pt.x = 4;
pt.y = 6;
ShowPoint(pt);
Point One = new Point();
One.CreatePointOneUnitAway(pt);
ShowPoint(One);
One.CreatePointOneUnitAway(new Point(-8، -3));
ShowPoint(One);
Console.ReadKey();
return 0;
}
}
نتیجه
Point Coordinates: A(4، 6) Point Coordinates: A(5، 7) Point Coordinates: A(-7، -2) Press any key to continue...
بازگرداندن گونه داده ای کلاسی از متد همان کلاس
می توانید متدی در کلاس ایجاد کنید که نمونه ای از همان کلاس را بر می گرداند. برای شروع کار، اسم کلاس مربوط را در سمت چپ متد وارد کنید.
مثال:
public class Point
{
public Point MethodName()
{
}
}
می توانید کارهای متفاوتی با متد موردنظر انجام دهید. اگر می خواهید مقدار جدیدی از کلاس باز گردانید، می توانید نمونه ای از کلاس را تعریف و مقداردهی اولیه کرده، سپس آن را برگردانید. به مثال زیر توجه کنید.
using System;
public class Point
{
internal int x;
internal int y;
public Point()
{
}
public Point(int XCoord، int YCoord)
{
this.x = XCoord;
this.y = YCoord;
}
public Point(Point Same)
{
this.x = Same.x;
this.x = Same.x;
}
public Point AdvanceBy5()
{
Point Some = new Point();
Some.x = 5;
Some.y = 5;
return Some;
}
}
public class Program
{
private static void ShowPoint(Point pt)
{
Console.Write("Point Coordinates: ");
Console.WriteLine("A({0}، {1})"، pt.x، pt.y);
}
static int Main(string[] args)
{
Point pt = new Point();
pt.x = 4;
pt.y = 6;
ShowPoint(pt);
Point Away5 = pt.AdvanceBy5();
ShowPoint(Away5);
Console.ReadKey();
return 0;
}
}
نتیجه
Point Coordinates: A(4، 6) Point Coordinates: A(5، 5) Press any key to continue...
می توانید نمونه ای از کلاس را تعریف کرده، مقادیر جاری کلاس را همراه با مقدارهای نمونه ی کلاس به کار ببرید تا مقادیر جدیدی به دست آورید، سپس نمونه ی مذکور را برگردانید.
مثال:
using System;
public class Point
{
internal int x;
internal int y;
public Point()
{
}
public Point(int XCoord، int YCoord)
{
this.x = XCoord;
this.y = YCoord;
}
public Point(Point Same)
{
this.x = Same.x;
this.x = Same.x;
}
public Point AdvanceBy5()
{
Point Some = new Point();
Some.x = this.x + 5;
Some.y = this.y + 5;
return Some;
}
}
public class Program
{
private static void ShowPoint(Point pt)
{
Console.Write("Point Coordinates: ");
Console.WriteLine("A({0}، {1})"، pt.x، pt.y);
}
static int Main(string[] args)
{
Point pt = new Point();
pt.x = 4;
pt.y = 6;
ShowPoint(pt);
Point Away5 = pt.AdvanceBy5();
ShowPoint(Away5);
Console.ReadKey();
return 0;
}
}
نتیجه
Point Coordinates: A(4، 6) Point Coordinates: A(9، 11) Press any key to continue...
به یاد داشته باشید که برای فراخوانی متد، چنانچه متد ایستا نبود، لازم است نمونه ی کلاس را از آن جایی که متد را فرا می خوانید، تعریف کنید. نوع دیگر پیاده سازی ( روش دوم آن) اصلاح نمونه ای است که متد را فرا می خواند. برای مثال، می توانید مقادیری به فیلدهای آن اضافه کنید، یا هر عملیات دیگری که نیاز دارید روی اعضای نمونه ی فراخوان (calling instance) پیاده کنید.
مثال:
using System;
public class Point
{
internal int x;
internal int y;
public Point()
{
}
public Point(int XCoord، int YCoord)
{
this.x = XCoord;
this.y = YCoord;
}
public Point(Point Same)
{
this.x = Same.x;
this.x = Same.x;
}
// This method adds 1 to each field of the class
// to get a new point away North-East of the current point
public Point CreatePointOneUnitAway()
{
this.x = this.x + 1;
this.y = this.y + 1;
return this;
}
}
public class Program
{
private static void ShowPoint(Point pt)
{
Console.Write("Point Coordinates: ");
Console.WriteLine("A({0}، {1})"، pt.x، pt.y);
}
static int Main(string[] args)
{
Point pt = new Point();
pt.x = 4;
pt.y = 6;
ShowPoint(pt);
Point One = new Point(-8، 5);
Point Another = One.CreatePointOneUnitAway();
ShowPoint(Another);
return 0;
}
}
نتیجه
Point Coordinates: A(4، 6) Point Coordinates: A(-7، 6) Press any key to continue...
شایان توجه است که می توان متدی ساخت که علاوه بر گرفتن آرگومان با کلاس والد خود هم نوع باشد. در متد، می توان به تمامی اعضای کلاس دسترسی داشت که از جمله ی آن فراخواندن دیگر متدهای کلاس مربوط می باشد.