PDA

View Full Version : سوال: Cycle در ارتباط بین کلاس هایی با طراحی ساده



ghayegh
چهارشنبه 24 مهر 1387, 12:21 عصر
با سلام
سوالی که دارم از قطعه کد ی است که باعث ایجاد Cycle می شود. ( کدش را به سایت فرستادم ) البته من می دانم که مفهوم منطقی کد زیر را به هزار تا روش دیگر هم می شود پیاده سازی کرد . ابتدا یک توضیحی مختصر راجع به کد زیر می دهم . یک کلاس Man یا مرد داریم ( با خصوصیات خودش ، مثل شغل ، و خصوصیات مردانه که اصلا در خانم ها وجود ندارد ) . یک کلاس Woman داریم ( با خصوصیات خودش ، که البته در زیر خصوصیات زنانه را برای اینکه کدها شلوغ نشود ، اضافه نکردم . ) در نهایت هم یک کلاس به نام Class_Abstract داریم که دو کلاس Man و Woman از آن مشتق می شوند.
مسئله این است که کد بالا در برنامه ی اصلی اجرا نمی شود .


دلیلش هم مشخص است . چون Cycle ایجاد می شود . حال مشکلی که من دارم این است که می خواهم هر طوری شده بگویم objMan.Woman.Name = “Golnaz”;

فقط خواهشا کسی در پاسخ به این سوال نگوید می توانستی در کلاس Class_Abstract یک فیلد Husband ایجاد کنی . چون من می خواهم این نقطه ای که بین Woman و objMan وجود دارد ، حتما باشد ( منظورم این است که اگر فرض کنیم که یک مرد هزار تا خصوصیت داشته باشد ، مثلا اخلاقش ، راحت بتوانیم بنویسیم : objMan.Akhlagh.Tarsoo که این متد یا نتیجه ی False بدهد و یا نتیجه ی True و یا بعنوان مثال دیگر objMan.Akhlagh.Mehraban که این متد هم یا نتیجه ی False بدهد یا True . بنابراین حالا که تعداد خصوصیات مرد زیاد است و هر کدام از خصوصیت ها ، باز به دسته هایی تقسیم می شوند ، پس بهتر است که این طبقه بندی وجود داشته باشد.
:تشویق:
واقعا ممنون می شوم اگر کسی بتواند به این سوال پاسخ دهد.
:لبخندساده:

SMRAH1
چهارشنبه 24 مهر 1387, 14:12 عصر
سلام

1) با اینکه احساس می کنم پرسیدن این سئوال شاید با توضیحات بالا نباید پرسیده شود، ولی دقیقا منظورشما از این سئوال چیست (مشخص است که این سئوال بهانه ایست برای مطرح کردن و رفع این مشکل است ولی دقیقا چرا و کجا می خواهید اینکار را انجام بدهید).شاید راه بهتری هم باشد.حداقل اینکه به اطلاعات ما نیز (در مورد کاربر یک چنین موردی) اضافه می شود.

2) من این کد را پیشنهاد می کند :


/*................................................. ...........*/
class Man : Class_Abstract
{
private Woman _Woman = null;
public Woman Woman
{
get
{
return _Woman;
}
}

public Man()
{
_Woman = new Woman(this);
}

public Man(Woman w)
{
_Woman = w;
}
}

/*................................................. ...........*/
class Woman : Class_Abstract
{
private Man _Man = null;
public Man Man
{
get
{
return _Man;
}
}

public Woman()
{
_Man = new Man(this);
}

public Woman(Man m)
{
_Man = m;
}
}
/*................................................. ...........*/
abstract class Class_Abstract
{
private string _Name = string.Empty;
public string Name
{
get
{
return _Name;
}
set
{
_Name = value;
}
}
}
/*................................................. ...........*/


موفق باشید

jaza_sa
چهارشنبه 24 مهر 1387, 16:26 عصر
به نظر اون روشی که نمیخواید اجرا کنیدش بهتره
میتونید در کلاس man یک خصوصیت با نام husband داشته باشید که نوع اونرو woman قرار بدید
حالا یک آبجکت از کلاس woman میسازید ،
اونرو مقدار دهی میکنید
اون آبجکت رو برابر با با خصوصیت husband آبجکت man قرار میدید

به اینصورت :


public class Man : Class_Abstract
{
Private Woman husband;
public Woman Husband
{
Get { return husband; }
set { husband = value; }
}
}

/*...................................*/

public class Woman : Class_Abstract
{
Private Man husband;
public Man Husband
{
Get { return husband; }
set { husband = value; }
}
}
نحوه استفاده :


Man objMan = new Man();
Woman objWoman = new Woman();

objWoman.Name = "?";
objWoman.Age = 30;
objWoman.Weight = 70;

objMan.Husband = objWoman;

ghayegh
چهارشنبه 24 مهر 1387, 16:29 عصر
با سلام

با تشکر از کسی که کدهایی را برای من ارسال کرد . ولی کدهای شما اشکال ظریف مفهومی دارد و آن تکه کدی است که در برنامه تان اجرا می شود :


Man objMan = newMan();
objMan.Name = "ali";
objMan.Woman.Man.Name = "reza";



مسلما این صحیح نیست که یک مرد ، بتواند دو اسم داشته باشد.


به هر حال اینکه گفتید بیشتر توضیح دهید :
با پاسخی که دادید من تصور می کنم سوالم را تا حدی که مدّ نظرم است ، متوجه شده اید . ضمنا من می ترسم مثال دیگری را برای تفهیم بیشتر بگویم ، آنوقت از اصل همین مسئله دور شویم . اگر ممکن است فعلا روی همین قضیه ی اشکال ظریف ، فکر کنیم.

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

قطعا هر چیزی یک سری خصوصیت دارد که آن خصوصیت ها ممکن است خودشان زیر مجموعه هایی داشته باشند . به خاطر همین است که من اصرار دارم از قضیه ی Polymorphism یا هر قضیه ی دیگری که این نقطه را بین objMan و Woman ایجاد می کند ، استفاده کنم :



Button




----------------------------------------



Style



----------------------------------------



backColor



visible



enable







----------------------------------------





----------------------------------------



Method



----------------------------------------



Onclick



Ondatabind



Onmouseover



----------------------------------------


حالا اگر بخواهم به شیوه ای که گفتم ، یعنی تمام چیزها حتی متدها را هم طبقه بندی کنم و به این شکل زیر از آن استفاده کنم :




objButton.Style.backColor = “red”;



objButton.Method.Onclick = true;



ممکن است که بگوئید ویژوال استادیو ، اینها را طور دیگری پیاده سازی کرده . مثلا برای دسترسی به اینکه آیا متد onclick کلیک شده یا نه ، روش دیگری را پیاده سازی کرده . ولی خوب من همانطور که گفتم ، می خواهم دسته بندی تر به خصوصیات اصلی و فرعی Button دسترسی داشته باشم.
:لبخندساده:

SMRAH1
پنج شنبه 25 مهر 1387, 19:32 عصر
سلام

براي رسيدن به يک هدف راه هاي زيادي است که معمولا هيچ کدام با هم منافاتي ندارند.در نتيجه در کد


Man objMan = newMan();
objMan.Name = "ali";
objMan.Woman.Man.Name = "reza";

در خطوط دو و سوم،دو راه براي يک کار است و به نظر من ايراد به نظر نمي رسه.
اما به نظر مي رسد منظور شما تاکيد بر اين موضوع است که نبايد بتوان نام را،بعد از اولين مقدار دهي،تغيير داد.در اين صورت کد زير را پيشنهاد مي کنم:


class Man
{
private string name = string.Empty;

Man()
{
}

public string Name
{
get
{
return name;
}

set
{
if (name != string.Empty)
throw new Exception("This object hasname!!");
else
name = value;
}
}
}

اگر اشتباهي در برداشت من هست، لطفا توضيح بفرماييد.
در ضمن اگر از فونت پيشفرض براي نوشته هايتون استفاده کنيد،به چشمهاي ما هم رحم کرديد.:لبخند:

موفق باشيد