PDA

View Full Version : سوال: چگونگی دسترسی یک زیرکلاس به Member های کلاس



ASKaffash
شنبه 01 تیر 1387, 09:54 صبح
سلام
دوستان باتجربه لطفا کمک کنند وبگویند چگونه خاصیت P در کلاس X میتواند در متد f درون زیرکلاس Y مورد استفاده قرار گیرد؟


public class X
{
public int P
{ set; get; }
public class Y
{
void f()
{
//P <-----?
}
}
}

Mahdi.Kiani
شنبه 01 تیر 1387, 12:19 عصر
فعلا دو راهی که به نظرم می رسه
1) Static کردن متغیر در کلاس Parent ( البته نیازی به public بودن ندارد)




class ParentClass
{
static int p;

class ChildClass
{


public ChildClass()
{
p = 10;

}


}
}




2) فرستادن نمونه ای از کلاس Parent به Constructor کلاس Child ( در این حالت نیاز یه Static نیست)




class ParentClass
{
int p;

class ChildClass
{
public ChildClass(ParentClass Parent)
{
Parent.p = 10;

}
}
}



اگر نیاز به دسترسی مستقیم به کلاس Child در خارج دارید، کلاس Child را public کنید

ASKaffash
شنبه 01 تیر 1387, 13:01 عصر
سلام
دوست من از شما تشکر میکنم . در راه اول با Static شدن خاصیت عمومی میشود ودر تعدد شی گرفته شده مقدار خاصیت یکی است که اصلا کار درستی نیست ولی روش دوم بنظر جالب است لطفا در مورد کلاس ParentClass کمی توضیح دهید که چگونه شی گرفته شده از ParentClass توسط استفاده کننده در یک قسمت دیگر برنامه که مقدار P را مثلا 20 کرده است درون متد f که اعلام کرده ام میتواند دسترسی داشته باشد ومقدار 20 را بداند درضمن شما کجا از کلاس ChildClass شی میگیرید؟

Mahdi.Kiani
شنبه 01 تیر 1387, 13:22 عصر
من در مورد خوب یا بد بودن روش ها ی فوق صحبتی نکردم. همه چیز به منظق برنامه شما ربط داره.
در مورد اینکه گفتید در مورد کلاس ParentClass توضیح بدم، مشکلتون را متوجه نشدم. دقیقا در چه مورد اشکال دارید.

ولی شاید منظورتون این باشد:




class ParentClass
{

private int intvar;

public int IntVar
{
get
{
return intvar;
}
set
{
intvar = value;
}
}


public class ChildClass
{
int p;
public ChildClass(ParentClass parent)
{
this.p = parent.IntVar;

}

public int GetNum()
{
return this.p;
}
}
}



مثال



ParentClass parent = new ParentClass();
parent.IntVar = 100;
ParentClass.ChildClass child = new ParentClass.ChildClass(parent);
MessageBox.Show(string.Format("I Initialized in parent and i'm calling From Child Class\n my Value is {0}",
child.GetNum()));


"امید وارم درست متوجه منظورتون شده باشم "


3 ) اگر کلاس Child به صورت Public باشه می تونید توسط کد زیر نمونه سازی کنید:




ParentClass.ChildClass child = new ParentClass.ChildClass(parent);




این روش : یعنی فرستادن نمونه ای به Constructor بیشتر در pattern هایی مثل Decorator استفاده می شه ( البته در اونجا بیش تر از خواص Interface ها بهره گرفته میشه)

ASKaffash
شنبه 01 تیر 1387, 14:36 عصر
سلام
دوست من خیلی از ابهامات حل شد فقط یک سئوال اینکه آیا میشود بدون Constructor با پارامتر مشکل را حل کرد چون در طراحی یک UserControl از این ویژگی استفاده میکنم ودرصورتیکه یک کلاس Constructor با پارامتر داشته باشد اتفاق عجیبی توسط Form ساز در C# به وقوع می پیوندد وآن اینکه خواص درون کلاس را میگیرد ولی در مخزن Property ها ذخیره نمیکند (بنظرم Bug است در مد طراحی) باتشکرازشما

Mahdi.Kiani
شنبه 01 تیر 1387, 17:01 عصر
خوب این طبیعی است و bug نیست.
در تهیه کنترل های جدید، اگر Constructor دارای آرگومان باشد، در مد Design ، میشه بگید که Compiler از کجا باید یک آبجکت از نوع آرگومان ایجاد کند و به Constructor شما بفرستد؟
می تونید چند تا Constructor داشته باشید که یکی از آن ها بدن آرگومان باشد.
مثال:


public class SampleControl :System.Windows.Forms.Control
{
private int a;

public int A
{
get
{
return a;
}
set
{
a = value;
}
}

public SampleControl(int a)
{
this.A = a;
}
public SampleControl():this(100)
{

}
}




در این حالت کنترل جدید شما مشکلی پیدا نخواهد کرد.!!!

اگر کدتان را بگذارید بهتر می تونم کمکتون کنم
موفق باشید