PDA

View Full Version : سوال: توضیح در رابطه با Set و Get



jaykob
پنج شنبه 06 اسفند 1388, 21:35 عصر
سلام دوستان من توضیحی می خواستم در رابطه با استفاده از Set و Get می خواستم base کلی ببینم واسه چی ساتفاده بشه یک مثال هم ازش بزنید و توضیح بدید به همراه اینکه بدنه دستور رو هم بگید خیلی خوبه ...
من دیدیم بیشتر به عنوان یک function استفاده می شه آیا دلیل خاصی داره ؟ بحث return چیه چرا در قسمت Set هست و دستورات در Get توضیح کاملی بدید ممنون می شم


:قلب:

Rejnev
پنج شنبه 06 اسفند 1388, 22:14 عصر
هر کلاس میتونه شامل چندین فیلد (همون متغیر ها) باشه که اطلاعات شی رو نگه میداره.
این فیلد ها یا سراسری است و یا خصوصی.
بجای این که بیایم و فیلد رو سراسری تعریف کنید و استفاده کننده از اون رو سردرگم کنید فیلد رو کپسوله سازی میکنیم.
با این کار یک property ایجاد کردیم که قابلیت کنترل مقادیری که در اون مینویسیم و یا میخونیم رو داریم.
در کل برای یک متغیر دو حالت میتونه اتفاق بیفته:خوانده شدن و نوشته شدن.



class myclass
{
int myField;
public int MyFieldProperty
{
get{return myField;}
set{myfield=value;}
}
}

get زمانی اتفاق میفته که ما فیلد رو بخونیم مثلا



console.write(MyFieldProperty);

و set وقتی که مقدار در اون بریزیم



MyFieldProperty=10;

مقدار 10 در value است و ما هنگام Set از اون استفاده میکنیم.
بدیهی است که هر کد دیگه ای رو میشه در get و set نوشت مثلا





class myclass
{
int myField;
public int MyFieldProperty
{
get{return myField;}
set{
if (value<100)
myfield=value;
else
console.write("over flow");
}
}
}



این هم یک خصوصیت فقط خواندنی:





class myclass
{
int myField;
public int MyFieldProperty
{
get{return myField;}
}
}

و فقط نوشتنی:





class myclass
{
int myField;
public int MyFieldProperty
{
set{myfield=value;}
}
}

r00tkit
پنج شنبه 06 اسفند 1388, 22:40 عصر
سلام من در حال تایپ جواب بودم (طولانی) که دیدم اقای mohammad_bagherani (http://barnamenevis.org/forum/member.php?u=99991) جواب رو داد البته بعد تایپ 1 صفحه حالا برای اینکه postam خالی نباشه :




Properties Overview
Properties enable a class to expose a public way of getting and setting values, while hiding implementation or verification code.

A get property accessor is used to return the property value, and a set accessor is used to assign a new value. These accessors can have different access levels. For more information, see Asymmetric Accessor Accessibility (C# Programming Guide).

The value keyword is used to define the value being assigned by the set indexer.

Properties that do not implement a set method are read only.

For simple properties that require no custom accessor code, consider the option of using auto-implemented properties. For more information, see Auto-Implemented Properties (C# Programming Guide).

jaykob
جمعه 07 اسفند 1388, 21:54 عصر
سلام

خیلی ممنون از هر دو عزیز که با صبوری پاسخ دادند ، این داستان رو تا حدود زیادی متوجه شدم . یاد گرفتن این مفاهیم احتیاج به استاد داره منم دارم خودم می خونم کمی اینجور مشکلات هم واسم پیش می آد که امید وارم با کمک شما دوستان حل بشه مثلا با HashTable ها مشکل پیدا کردم و نفهمیدم کلا بیخیالشون شدم ...

من یک کد که واسه ویرایشگر متن هست رو می زارم و اینکه هدف اصلی استفاده از کپسوله سازی با set و Get توی این کد رو اگه توضیح بدید ممنون می شم ...



namespace Editor
{
public partial class Editor : Form
{
public string StatusText
{
get
{
return sspstatus.Text;
}
set
{
sspstatus.Text = value;
}
}

public string EditText
{
get
{
return txtedit.Text;
}
set
{
txtedit.Text = value;
}
}
public void ClearEditBox()
{

EditText = String.Empty;

txtedit.ForeColor = Color.Black;

StatusText = "Text box cleared!";
}
public void RedText()
{

txtedit.ForeColor = Color.Red;

StatusText = "The text is red";
}
public void BlueText()
{
txtedit.ForeColor = Color.Blue;
StatusText = "The text is blue";
}
public void UpperCase()
{
EditText = EditText.ToUpper();
StatusText = "The text is all uppercase";
}
public void LowerCase()
{
EditText = EditText.ToLower();
StatusText = "The text is all lowercase";
}
public void GreenText()
{
txtedit.ForeColor = Color.Green;
StatusText = "The text is green";
}
public Editor()
{
InitializeComponent();
}

private void txtedit_TextChanged(object sender, EventArgs e)
{
StatusText = "Ready";
}

private void tbrclear_Click(object sender, EventArgs e)
{
ClearEditBox();
}

private void tbrred_Click(object sender, EventArgs e)
{
RedText();
}

private void tbrblue_Click(object sender, EventArgs e)
{
BlueText();
}

private void tbruppercase_Click(object sender, EventArgs e)
{
UpperCase();
}

private void tbrlowercase_Click(object sender, EventArgs e)
{
LowerCase();
}

private void tbrabout_Click(object sender, EventArgs e)
{
MessageBox.Show("Editor Program ; CopyRight2010 ",
"About");
StatusText = "About";
}

private void tbrgreen_Click(object sender, EventArgs e)
{
GreenText();
}

}
}


برداشت من از این کپسوله سازی اینه که ما تنها یک مقدار به فیلد می فرستیم و اون رشته رو به خاصیت .text تغییر داده . و به ما نشون می ده .
ما این کار رو به صورت تعریف متغییر هم می تونیم انجام بدیم اما برای هر کدام باید یک متغییر تعریف کنیم که حجم رو می بره بالا و باعث خوانایی کمتر می شه ...

امید وارم درست بوده باشه . دوستان هم هر آنچه صلاح می دونند اضافه کنند تا بهتر مواجه بشم


:قلب:

FastCode
جمعه 07 اسفند 1388, 22:41 عصر
بخش آخر رو درست گفتید چون هنوز از مزایایی که کپسوله کردن به ما میده با خبر نشدید.
شما میتونید توی دستورات get و set چیزهای دیگه ای هم بنویسید.(یکی از پایه های اصلی برنامه نویسی شی گرا)

jaykob
شنبه 08 اسفند 1388, 00:22 صبح
ممنون

دوستان اگه کس دیگه ای می تونه مواردی رو اضافه کنه ممنون می شم و اگه مقاله ای در ربطه با کپسوله سازی و معانی شی گرا داشتید ممنون می شم بزارید واسم . چون اولین زبان شی گرایی هست که کار می کنم قبلا اسکریپت نویسی کار کردم ...

:قلب:

Rejnev
شنبه 08 اسفند 1388, 00:38 صبح
یک pdf مربوط به آموزش جامع C#‎‎ هست که مولف اون آقای محمد هاشمیان هست.
توی اینترنت سرچ کنید پیدا خواهید کرد

آموزش جامع ویژوال C#‎‎

کتاب شامل دو بخش در رابطه با شیئ گرایی هست که کامل در مورد اینها توضیح داده.
حجم فشرده شده کتاب حدود 9 مگه و 950 صفحه داره.

jaykob
یک شنبه 09 اسفند 1388, 20:07 عصر
ممنون من خودم دارم از روی همون کتاب تمرین می کنم :)

دوستان یک سوال من الان می خوام یک کپسوله ایجاد کنم که value که می فرستیم بهش بیاد و در list box نشون بده . اما زمانی از lst.items.add در set استفاده می کنم error می ده ! این کپسوله رو چجوری می تونم ایجاد کنم ؟

:قلب:

Rejnev
دوشنبه 10 اسفند 1388, 00:47 صبح
ممنون من خودم دارم از روی همون کتاب تمرین می کنم :)

دوستان یک سوال من الان می خوام یک کپسوله ایجاد کنم که value که می فرستیم بهش بیاد و در list box نشون بده . اما زمانی از lst.items.add در set استفاده می کنم error می ده ! این کپسوله رو چجوری می تونم ایجاد کنم ؟

:قلب:
با این متن کوتاهی که شما نوشتید این رو برداشت میکنم:
احتمالا شما یک کلاس تعریف کردید با یک پراپرتی به این صورت:



namespace ...
{
class myClass
{
int _a;
public int A
{
get{return _a;}
set
{
_a=value
lst.items.add(value);
}
}
,...
}
//------------------
class form1
{...
}
}

و احتمالا در فرم خودتون یک ListBox دارید به نام lst و موقعی که در خصوصیت A در کلاس MyClass مقدار میریزید انتظار دارید به یک داده(شئ در کلاس فرم) که در محدوده MyClass معتبر نیست دسترسی داشته باشید. یعنی به lst در کلاس فرم، داده وارد کنه که امکان پذیر نیست مگر اینکه lst رو به عنوان آرگومان به یک متد در کلاس MyClass ارسال کنید و در آنجا محتویات اون رو تغییر بدید.





class MyClass
{
public void addItem(ListBox lstInput)
{
lst.Items.Add(_a);
}
,...
}

در بالا باید بعد از تغییر(و یا هر موقع که مایلید) متد addItem را صدا بزنید.این متد یک ListBox به عنوان ورودی میگیرد.
راه دیگه اینه که در کلاس خودتون یک خصوصیت از نوع ListBox داشته باشید و هر موقع که خصوصیت A تغییر کرد مقدار A رو در این List اضافه کنید






class myClass
{
ListBox lst;
public myClass(ListBox _lst)
{
lst=_lst;
}
int _a;
public int A
{
get{return _a;}
set
{
_a=value
lst.items.add(value);
}
}
,...
}





class form...
private void btn_Click(object ...)
{
myClass mc=new myClass(this.lst);
mc.A=10;
}

راه حل های دیگه هم داره، فعلا که همینا به ذهنم میرسه.
این جور موارد کمتر استفاده میشه ولی چون سوال کردید خواستم بگم که میشه یک جوری نوشتش.