PDA

View Full Version : چطور باید این کلاس رو نوشت



MShirzadi
پنج شنبه 05 مهر 1386, 08:04 صبح
من می خوام که یه کلاس بسازم مثل زیر از اون استفاده کنم


class1.items(0).value()

یعنی یه چیزی مثل ListBox که وقتی ما می گیم


ListBox1.items(0).tostring()

که اطلاعاتی مربوط به آیتم 0 این ListBox را بر می گرداند

hassan razavi
پنج شنبه 05 مهر 1386, 10:38 صبح
مس تونید یک Structure یا آزایه ای از جنس دلخواه در کلاستون تعریف کنید

sinpin
پنج شنبه 05 مهر 1386, 13:14 عصر
من می خوام که یه کلاس بسازم مثل زیر از اون استفاده کنم


class1.items(0).value()یعنی یه چیزی مثل ListBox که وقتی ما می گیم


ListBox1.items(0).tostring()که اطلاعاتی مربوط به آیتم 0 این ListBox را بر می گرداند

شما میتونید از یک collection در کلاستون استفاده کنید.
مفهوم Indexer هم شاید مفید باشه.

MShirzadi
پنج شنبه 05 مهر 1386, 20:36 عصر
دوستان لطف کنن یک مثال بزارن خواستم قبل از ایجاد این تاپیک این کار رو بکنم اما که نشد
ممنونم

MShirzadi
جمعه 06 مهر 1386, 15:34 عصر
class1 رو بسازید items رو از نوع آرایه یا arraylist داخل اون تهریف کنید.

abstract public class class1
{
//statement
class2 items[];
}
خاصیت valueی هم که استفاده کردین میتونه داخل class2 باشه.
توضیح: اگه می خواین از روی class1 نمونه سازی بکنید باید کلمه abstract رو از خط اول حذف کنید.
شکل صحیح فراخوانیشم اینجوریه:
class1.items[0].value


آقای Mehralian ایکدی که نوشتی سره [] به من خطا می ده معلوم هست که غلطه یه کمی بهش نگاه کن تا تصصیح بشه لطفا (البته فکر کنم که باید [] به اول بیاد یعنی می شه

Class2[] itemes;
)

از دوستان دیگه که می خوان به من کمک کنن لطفا یه مثال کامل بزارن که من اونو توی کلاس خودم کپی کنم و جواب بگیرم (آخه من چیز زیادی در این زمینه نمی دونم)
در ضمن این رو هم بگید که من زمانی که میگم مثلا

class1.items[index].value
ما از کجا بفهمبم که index وارد شده چند است
با تشکر از همه

emad_67
جمعه 06 مهر 1386, 16:39 عصر
برای مثال اینو ببین


publicclassClass1
{
privateArrayList _items = newArrayList();
publicvoid Add(object obj)
{
_items.Add(obj);
}
publicArrayList items
{
get
{
return _items;
}
}
}

از این کلاس میتونی به شکل زیر استفاده کنی


string s="Hello";
Class1 objClass = newClass1();
objClass.Add(s);
string str = (string)objClass.items[0];
MessageBox.Show(str);

چون item از نوع ArrayList هست بنابراین با وارد کردن index به اون عضو از ArrayList دست پیدا میکنی

MShirzadi
جمعه 06 مهر 1386, 16:59 عصر
آقا من نمیدونم که بد توضیح میدم یا ...
من یه کلاسی میخوام بنویسم که شبیه همان چیزی که آقای عماد گفتند اما من میخوام چند تا آیتم به items اضافه کنم یعنی


List1.items[0].value
که وقتی کاربری این کد رو درخواست کرد من اطلاعاتی راجع به ایتم 0 را که در items قرار دارد به او برگردانم
حالا امید وارم تونسته باشم منظورم روبرسونم

sinpin
شنبه 07 مهر 1386, 08:22 صبح
آقا من نمیدونم که بد توضیح میدم یا ...
من یه کلاسی میخوام بنویسم که شبیه همان چیزی که آقای عماد گفتند اما من میخوام چند تا آیتم به items اضافه کنم یعنی
که وقتی کاربری این کد رو درخواست کرد من اطلاعاتی راجع به ایتم 0 را که در items قرار دارد به او برگردانم
حالا امید وارم تونسته باشم منظورم روبرسونم

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

MShirzadi
شنبه 07 مهر 1386, 08:27 صبح
آقا من هم می گم چطوری لطفا یه مثال بزنید
بابا من خیلی وقت هست که میخوام یه تابع بنویسم و بخواطر این موظوع موندم
بگید چی کار کنم لطفا

sinpin
شنبه 07 مهر 1386, 08:42 صبح
شما یک کلاس میسازید که صفاتی مثل Value, Key و ... داشته باشه. بعد توی کلاس ListBox یک آرایه از اون رو تعریف میکنید.


Indexers permit instances of a class or struct to be indexed in the same way as arrays. Indexers are similar to properties except that their accessors take parameters.کلاس Item باید ایندکسر باشه. به این شکل :
http://www.developer.com/net/csharp/article.php/1547581
http://msdn2.microsoft.com/en-us/library/6x16t2tx(VS.71).aspx (http://msdn2.microsoft.com/en-us/library/6x16t2tx%28VS.71%29.aspx)

MShirzadi
شنبه 07 مهر 1386, 10:32 صبح
آقا من راستش هنوز جواب نگرفتم(خیلی باید ...)
آقا ببینید من یه چیزی مثل این می خوام


public class Parent
{
public int Getcount()
{
return 5;
}
public child items = new child();
}
public class child
{

}حالا میای توی فرم تعریف می کنی


MyMain.Parent p = new MyMain.Parent();
الان شما

p.Getcount();میزنی و به چیزی بر می گردونه (مهم نیست)
اما حالا اون چیزی که من می خوام این هست که :
اولا tiems از نوع آرایه تعریف شود و ما بتوانیم یه سری Property به items اضافه کنیم (فکر کنم مبحث Inherits باشه) که ما هر کدوم از اون properties ها رو زدیم داخل اون properties تشخیص بده کا index وارد شده چند است و با توجه به index وارد شده یه سری اطلاعات برگردونه
مثلا در یه string آرایه ای اینجوری هست که :

string[] str =new string[10];
MessageBox.Show(str[3].Length.toString());
ببینید در این حالت مقدار طول آرایه ای که index آن 3 است را بر می گرداند .
حالا اون چیزی که من می خوام اینه که مثلا یه تابع بنویسم که این کار رو بکنه

p.items[8].getValue();البته در خاتمه این رو هم بگم که ما نمونه ی این کار رو در DataSet هم داریم یعنی


Dataset ds=new Dataset();
ds.tables[2].rows.count();
که در این کد Count مربوط به table دوم را بر می گرداند یعنی باز هم index را تشخیص می دهد

امیدوارم تونسته باشم منظورم رو برسونم
فعلا بای

sinpin
شنبه 07 مهر 1386, 11:21 صبح
سورس کد رو توی ضمیمه اضافه کردم میتونید دانلود کنید.


class Parent
{
private List<Child> items = new List<Child>();

public List<Child> Items
{
get { return items; }
set { items = value; }
}

public Parent()
{
}

public void AddItems(string _text)
{
Child child = new Child();
child.Text = _text;
items.Add(child);
}
}

public class Child
{
public int Length
{
get { return this.Text.Length; }
}

private string text;

public string Text
{
get { return text; }
set { text = value; }
}
}

sinpin
شنبه 07 مهر 1386, 11:23 صبح
البته من اول منظور شما رو اشتباه متوجه شده بودم تو این مورد نیازی به ایندکسر نیست. :بامزه:


private void Form1_Load(object sender, EventArgs e)
{
Parent p = new Parent();
p.AddItems("Salam!");
Child child = new Child();
child.Text="Hello dear!";
p.Items.Add(child);
MessageBox.Show(p.Items[0].Length.ToString());
MessageBox.Show(p.Items[1].Length.ToString());
}

sinpin
شنبه 07 مهر 1386, 11:29 صبح
p.items[8].getValue();البته در خاتمه این رو هم بگم که ما نمونه ی این کار رو در DataSet هم داریم یعنی


Dataset ds=new Dataset();
ds.tables[2].rows.count();
که در این کد Count مربوط به table دوم را بر می گرداند یعنی باز هم index را تشخیص

در مورد مثالی که زدید :
System.Data.DataTableCollection
public sealed class DataTableCollection : System.Data.InternalDataCollectionBase
Member of System.Data

Summary:
Represents the collection of tables for the System.Data.DataSet.

PC2st
شنبه 07 مهر 1386, 19:44 عصر
که در این کد Count مربوط به table دوم را بر می گرداند یعنی باز هم index را تشخیص می دهد
برای تشخیص ایندکس باید از ایندکسر استفاده کنید و برای استفاده از Collection ها، همانطور که sinpin اشاره داشتند، میتونید یک فیلد از نوع Collection تعریف کنید یا یکی از Collection های موجود را ارث بری کنید.

برای تشخیص عدد ایندکسر... مثلا:


class A
{
private object o;
public object this[int index]
{
get
{
if(index != 0) return null;
return this.o;
}
set
{
if(index != 0) return;
this.o = value;
}
}
}

و استفاده:


A a = new A();
a[0] = "A";
Console.WriteLine((string)a[0]);

که فقط میشه عدد 0 رو به ایندکسر ارسال کرد.