delegate
همان طور که می دانید یک متد می تواند چندین پارامتر با نوع های مختلف را یکجا دریافت نماید.مانند عدد صحیح ، اعشاری و یا رشته اما تا کنون به این فکر کرده اید که آیا می شود یک متد را بعنوان پارامتری به متد دیگر تحویل داد .
اگر قصد چنین کاری را دارید ، متدی را که می خواهید بعنوان پارامتر باشد بایستی بصورت delegate تعریف کنید .
برنامه زیر نمونه ای از کاربرد دلیگیت می باشد .
using System;
namespace deligayt
{
class Program
{
public delegate void Print(int value);
static void Main(string[] args)
{
// Print delegate points to PrintNumber
Print printDel = PrintNumber;
printDel(100000);
printDel(200);
// Print delegate points to PrintMoney
printDel = PrintMoney;
printDel(10000);
printDel(200);
Console.ReadLine();
}
public static void PrintNumber(int num)
{
Console.WriteLine("Number: {0,-12:N0}", num);
}
public static void PrintMoney(int money)
{
Console.WriteLine("Money: {0:C}", money);
} } }
یک نمونه برنامه دیگر از نحوه استفاده از دلیگیت :
using System;
delegate int NumberChanger(int n);
namespace DelegateAppl {
class TestDelegate {
static int num = 10;
public static int AddNum(int p) {
num += p;
return num;
}
public static int MultNum(int q) {
num *= q;
return num;
}
public static int getNum() {
return num;
}
static void Main(string[] args) {
//create delegate instances
NumberChanger nc1 = new NumberChanger(AddNum);
NumberChanger nc2 = new NumberChanger(MultNum);
//calling the methods using the delegate objects
nc1(25);
Console.WriteLine("Value of Num: {0}", getNum());
nc2(5);
Console.WriteLine("Value of Num: {0}", getNum());
Console.ReadKey(); } } }
خروجی برنامه بالا بصورت زیر می باشد . - - - - -
Value of Num: 35 Value of Num: 175
داینامیک متغیری است که نوع آن در زمان اجرا مشخص و تعیین می گردد نه در زمان کمپایل شدن . یعنی ما می توانیم هر نوع داده را درون آن جای دهیم.
این نوع متغیر با کلمه رزرو شده dynamic تعریف می شود.
dynamic Varname = 1;
کمپایلر معمولا این نوع متغیر را هنگام کمپایل به نوع object تبدیل می کند .
Interface
اینتر فیس ظاهری شبیه کلاس دارد و دارای تعاریف ، متدها ، صفت ها و رویدادهاست ولی قابل پیاده سازی نمی باشد و این بر عهده کلاس است که اعضاء اینترفیس را آنگونه که می خواهد پیاده سازی کند.
نکته : اینترفیس نمی تواند دارای اعضاء Private باشد بلکه بصورت پیش فرض بصورت Public می باشند.
یک اینترفیس با کمک کلمه رزرو شده interface تعریف می شود .
using System;
namespace InterfaceApplication {
public interface ITransactions {
// interface members
void showTransaction();
double getAmount();
}
public class Transaction : ITransactions {
private string tCode;
private string date;
private double amount;
public Transaction() {
tCode = " ";
date = " ";
amount = 0.0;
}
public Transaction(string c, string d, double a) {
tCode = c;
date = d;
amount = a;
}
public double getAmount() {
return amount;
}
public void showTransaction() {
Console.WriteLine("Transaction: {0}", tCode);
Console.WriteLine("Date: {0}", date);
Console.WriteLine("Amount: {0}", getAmount());
}
}
class Tester {
static void Main(string[] args) {
Transaction t1 = new Transaction("001", "8/10/2012", 78900.00);
Transaction t2 = new Transaction("002", "9/10/2012", 451900.00);
t1.showTransaction();
t2.showTransaction();
Console.ReadKey();
} } }
خروجی برنامه بصورت زیر می باشد
Transaction: 001 Date: 8/10/2012 Amount: 78900 Transaction: 002 Date: 9/10/2012 Amount: 451900
کلاس : Class
کلاس مفهومی شبیه نقشه یک ساختمان دارد که خود به تنهایی مثلا قابل سکونت نیست بلکه بایستی یک نمونه ( ساختمان ) از روی آن ساخت و از آن نمونه ساخته شده استفاده کرد.یعنی در واقع کلاس یک Concept از شیء ایست که می خواهیم داشته باشیم .
یک کلاس دارای اعضائی است که این اعضاء به دو دسته تقسیم می شوند 1 . داده ها و 2 . عملکردها .
داده ها شامل فیلدها ( Fields) و خصوصیات ( properties ) و عملکردها نیز شامل رویدادها ( Events ) و متدها ( methods ) می باشند.
کلاس { فیلدها و خصوصیات - رویدادها و عملکردها }
یک کلاس با استفاده از کلید واژه class و به دنبال آن نامی برای کلاس و دو علامت { } تعریف می شود .
در مثال زیر کلاسی به نام MyClass تعریف شده که هیچ عضوی ندارد و در واقع هیچ کاری هم انجام نمی دهد.
class MyClass
{
}
همانطور که در بالا بیان شد کلاس دارای اعضایی است . قبل از اضافه کردن اعضاء درون کلاس به این نکته توجه داشته باشید که هر کلاس برای اجرا شدن حتماً به یک سازنده ( constructor) احتیاج دارد وگرنه کلاس ما بدون انجام هیچ واکنشی بدون استفاده باقی می ماند. یک سازنده بوسیله تعیین یک سطح دسترسی و نامی دقیقا مشابه نام کلاس و علامت () تعریف می گردد که می تواند دارای پارامتر و یا بدون پارامتر باشد.( در مثال زیر سازنده کلاس MyClass هیچ پارامتری دریافت نمی کند. ضمنا این Constructor بطور اتومتیک اجرا می شود )
نکته : سازنده کلاس می تواند پس از ساخت یک نمونه از کلاس نیز بطور دستی اجرا گردد که در ادامه به آن اشاره خواهد شد .
class MyClass
{
public MyClass()
{
}
}
دقت کنید : همانطور که در بالا بیان شد برای دسترسی به اعضاء یک کلاس و استفاده از عملکردهای آن می بایست ابتدا یک نمونه یا شیء( Object ) از آن کلاس را ساخت و سپس به کمک آن شیء به اعضاء کلاس دسترسی پیدا کرد.
using System;
namespace ClassTest
{
class Program
{
class MyClass
{
int nonStaticVariable;
static int staticVariable;
public void SetVars(int v1, int v2)
{
nonStaticVariable = v1;
staticVariable = v2;
}
public void Display()
{
Console.WriteLine("nonStaticVariable = {0} staticVariable = {1}", nonStaticVariable, staticVariable);
Console.ReadKey();
}
}
static void Main()
{
MyClass d1 = new MyClass();
MyClass d2 = new MyClass();
d1.SetVars(2, 4);
d1.Display();
d2.SetVars(15, 17);
d2.Display(); } } }
که پس از اجرا ابتدا شیء d1 و سپس با زدن اینتر شیء d2 اجرا می شوند. خروجی برنامه بصورت زیر می باشد.
nonStaticVariable = 2 staticVariable = 4
nonStaticVariable = 15 staticVariable = 17