PDA

View Full Version : ساخت کلاس



alireza_tavakol
شنبه 31 شهریور 1386, 02:32 صبح
آقا توی همه کتاب ها مینویسن string یک نوع داده نیست و یک کلاس است
حالا یه سوال من میخوام یه کلاس بنویسم که شی ازش بوجود نیارم واستاتیک هم نباشه
مثلا myClass myobject و نمی خوام هیچوقت بنویسم myClass myobject=new myclass
چه طوری میشه یه همچین کلاسی نوشت؟

PC2st
شنبه 31 شهریور 1386, 04:22 صبح
حالا یه سوال من میخوام یه کلاس بنویسم که شی ازش بوجود نیارم واستاتیک هم نباشه
حتی در هنگام استفاده از یک کلاس استاتیک، در واقع یک شیئ از آن قبلا ایجاد شده و دارید با یک شیئ از کلاس استاتیک کار میکنید.


مثلا myClass myobject و نمی خوام هیچوقت بنویسم myClass myobject=new myclass
نمیشه مگر بصورت static :-)

emad_67
شنبه 31 شهریور 1386, 08:32 صبح
حالا یه سوال من میخوام یه کلاس بنویسم که شی ازش بوجود نیارم واستاتیک هم نباشه
مثلا myClass myobject و نمی خوام هیچوقت بنویسم myClass myobject=new myclass
چه طوری میشه یه همچین کلاسی نوشت؟

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

PC2st
شنبه 31 شهریور 1386, 12:09 عصر
اگر منظورتون چیزی باشه که emad_67 بهش اشاره کردند... اگر متد سازنده بصورت private باشه، دیگه نمیشه ازش نمونه شیئ ایجاد کرد مگر در خود کلاس. و اگر متد سازنده بصورت protected باشه، دیگه نمیشه ازش نمونه شیئ ایجاد کرد مگر در خود کلاس یا کلاس فرزند.

mohammad272005
سه شنبه 03 مهر 1386, 00:43 صبح
خب حالا کلاسی که instantial باشه نه static بجز base شدن، به چه درده دیگه‏ای می‏خوره؟

PC2st
سه شنبه 03 مهر 1386, 01:15 صبح
به چه درده دیگه‏ای می‏خوره؟
بدرد موارد دیگه ای هم میخوره، میشه یک ارایه ای از کلاسهای فرزند داشت که کلاسهای فرزند یکی نیستند ولی پدرشان یکی است یا ...

همچنین در الگوهای طراحی (Design Patterns) هم کاربرد داره، مثلا در الگوی طراحی Factory از کلاس abstract استفاده میشه (از اینترفیس هم میشه).
در مورد کلاسهایی که سازنده اونها private هست، از این کلاسها در الگوی طراحی Singleton استفاده میشه.

برای اطلاعات بیشتر در مورد الگوهای طراحی، در MSDN ای که همراه ویژوال استودیو نصب میشه، عبارت زیر رو جستجو کنید:
Exploring Design Pattern

alireza_tavakol
سه شنبه 03 مهر 1386, 02:14 صبح
آقایون چرا بحثو عوض میکنید
اگه قبول دارید که String یک کلاس است و یک نوع داده نیست
حلا منم میخوام همون طوری که یک متغییر از کلاس String میسازیم (یعنی یک شی)
و بعدم باهاش کار میکنیم (بدون این که حافظه بهش اختصاص بدیم new )
منم یه همچین کلاسی بنویسم

alireza_tavakol
سه شنبه 03 مهر 1386, 02:24 صبح
در ضمن نوع abstract ربطی به صحبت من نداره اون برای پیاده سازی متد های استاندارد و اجباری در کلاس فرزند

PC2st
سه شنبه 03 مهر 1386, 13:01 عصر
فهمیدم منظورت چی بود، میتونی از struct برای داده ها استفاده کنین، مثلا:


struct MyData
{
public int counter;
}

برای استفاده:


MyData data;
data.Counter = 4;

که نیازی به کلمه کلیدی new نیست... (بهرحال نمونه شیئ ایجاد شده)

alireza_tavakol
سه شنبه 03 مهر 1386, 16:46 عصر
با تشکر از کلیه دوستان به خصوص سرور عزیزم PC2st که به من لطف دارن
عزیزم سوال من ایجا رکورد نبود من میخواهم یه کلاس بنویسم که شامل چندین متد باشه
ولی منظورمو خوب فهمیدی که چه طوری میخواهم به کلاسم و شی ایجاد شده از اون کلاس دسترسی پیدا کنم

PC2st
سه شنبه 03 مهر 1386, 17:47 عصر
با تشکر از کلیه دوستان به خصوص سرور عزیزم PC2st که به من لطف دارن
خواهش میکنم، سروری از شماست.

در مورد دسترسی به متد بدون ایجاد یک شیئ توسط new (و بدون استفاده از static)، حداقل تا امروز راه حلی براش در سی شارپ وجود نداره.

کلاس string یک کلاس هست و البته یک نوع داده هم هست. از اینکه بدون new کردن میخواید ازش نمونه بسازید، منظورتون چیست؟ یعنی میخواید که خودتون یک ثابت رشته ای یا عددی بهش بدید؟ یا ... ؟ اگر میشه یک مثال بزنید.

alireza_tavakol
چهارشنبه 04 مهر 1386, 02:07 صبح
در مورد دسترسی به متد بدون ایجاد یک شیئ توسط new (و بدون استفاده از static)، حداقل تا امروز راه حلی براش در سی شارپ وجود نداره.



دوست عزیز شما قبول داری String یک کلاس است
String ali = "salam";
MessageBox.Show(ali.Length.ToString());
در این بخش از کد ها من یک شی از کلاس String ایجاد کردم به اسم ali و در همون خط بدون استفاده از کلمه کلیدی new امدم و با شی ali کار کردم و در خط بعدی متدی از کلاس String صدا زدم که اون متد هم static نبوده و مقداری را به عنوان طول رشته به من داده است

حالا من میخواهم کلاسی مثل String ایجاد کنم که
1-امکان ایجاد کردن شی را داشته باشه
2-در هنگام آغاز کار با شی ایجاد شده نیاز به new نباشه
3-این کلاس ایجاد شده دارای متد های باشه

alireza_tavakol
چهارشنبه 04 مهر 1386, 02:11 صبح
البته نا گفته نمونه من یه نامه خصوصی از طرف یکی از کاربران سایت دریافت کردم در مورد پاسخ به این سوال

PC2st
چهارشنبه 04 مهر 1386, 04:38 صبح
مثالی از کلاسی که میخواید ایجاد کنید بزنید! مثلا:


MyClass mCs = "my data is here";
return mCs.GetSpaces();

شبیه به چنین کلاسی مد نظر شماست؟ اگر جوابش بله باشه، میتونید تبدیل نوع صریح رو آورلود کنید، مثلا کلاس زیر رو در نظر داشته باشید:


class WordFind
{
private string data;
public WordFind(string data)
{
this.data = data;
}
public int GetWordCount()
{
return this.data.Split(' ').Length;
}
public static implicit operator WordFind(string data)
{
return new WordFind(data);
}
}

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


WordFind wFind = "Hello My Word";
Console.WriteLine(wFind.GetWordCount());

که از new استفاده نشده... و کار این کلاس شمردن تعداد کلمات در متن است.

alireza_tavakol
پنج شنبه 05 مهر 1386, 02:34 صبح
بابا تو دیگه کی هستی
با عرض تشکر از پیگیری جناب عالی PC2st.ir
دقیقا منظور من همین بود
دوست عزیز این کلاسی رو که نوشتین متدی دارد که حافظه مورد نیاز شی ساخته شوده را تامین مینمایید
public static implicit operator WordFind(string data)
{
return new WordFind(data);
}
لطفا یه کم توضیح فنی راجب کلمات زیر و روش کار این متد عرض نمایید البته این یه خواهش عاجزانه است
implicit
operator

PC2st
پنج شنبه 05 مهر 1386, 13:22 عصر
خواهش میکنم... ، در سی شارپ میشه عملیات تبدیل نوع رو آورلود کرد همانطور که یک عمگر ریاضی (مثل جمع و تفریق) رو میشه آورلود کرد.

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


WordFind wf1 = new WordFind();
WordFind wf2 = new WordFind();
WordFind wf3 = wf1 + wf2;

علاوه بر آورلود کردن یک عملگر، میشه تبدیل انواع داده ای رو هم آورلود کرد، مثلا برای کلاسی که تعریف کرده ایم، میشه همچنین کاری رو انجام داد:


WordFind wf = new WordFind();
string str = "Hello";
wf = str;

اگر کدهای فوق رو مختصر تر کنیم، چیزی شبیه به زیر میشه:


WordFind wf;
wf = "Hello";

یا حتی مختصر تر:


WordFind wf = "Hello";


در واقع در کلاسی که نوشتم و از implicit operator استفاده کردم، توسط این قسمت، میشه کاری کرد که بتونیم یک رشته (string) رو به نوع WordFind (کلاسی که اینجا تعریف شده) تبدیل کنیم. کلمه کلیدی operator مشخص میکنه که میخوایم یک عملگر رو آورلود کنیم و کلمه کلیدی implicit مشخص میکنه که میخوایم اون عملگر، عملگر تبدیل ضمنی باشه. اگر بجای کلمه کلیدی implicit از کلمه explicit استفاده کنیم، یعنی اینکه میخوایم عملگر تبدیل صریح رو آورلود کنیم، که در اینصورت، کلاس شبیه به زیر میتونه عمل میکنه:


WordFind wf = (WordFind)"Hello";
// یا بصورت زیر
WordFind wf;
string str = "Hello";
wf = (WordFind)str;


همچنین در هنگام آورلودکردن تبدیل انواع، همانطور که دیدید یک متد static است که یک پارامتر میگیره، نوع پارامتر ورودی، مشخص کننده نوعی است که باید به نوع WordFind تبدیل بشه.

alireza_tavakol
جمعه 06 مهر 1386, 01:51 صبح
بازم شرمندم که بحث به درازا کشید اما صحبت قشنگی شد که دوست دارم سوال کنم
فرض کنید من یک کلاس دارم برای مقدار های کسری و یا یک کلاس دارم برای ذخیره سازی ماتریس ها
حالا میخوام عمل جمع کردن بین دو شی از کلاس ایجا شده را پیاده سازی کنم مثلا

myclass myobject1;
myclass myobject2;
myobject1=myobject1+myobject2
چه طوری میتونم عملگر + رو آور لود کنم برای کلاس خودم؟

ghafoori
جمعه 06 مهر 1386, 16:15 عصر
دوست عزیز ایت هم یک مثال

public class ComplexNumber
{
private int real;
private int imaginary;

public ComplexNumber() : this(0, 0) // constructor
{
}

public ComplexNumber(int r, int i) // constructor
{
real = r;
imaginary = i;
}

// Override ToString() to display a complex number in the traditional format:
public override string ToString()
{
return(System.String.Format("{0} + {1}i", real, imaginary));
}

// Overloading '+' operator:
public static ComplexNumber operator+(ComplexNumber a, ComplexNumber b)
{
return new ComplexNumber(a.real + b.real, a.imaginary + b.imaginary);
}

// Overloading '-' operator:
public static ComplexNumber operator-(ComplexNumber a, ComplexNumber b)
{
return new ComplexNumber(a.real - b.real, a.imaginary - b.imaginary);
}
}

alireza_tavakol
یک شنبه 08 مهر 1386, 16:52 عصر
دوستان من خیلی پرو هستم هی سوال میپرسم
چون عنوان تاپیک خوبه سوال جدید مو هم اینجا می پرسم
آقایون من بلدم یک کلاس رو داخل یک کلاس دیگه تعریف کنم ولی نمیدونم این عمل منطقا کی و کجا کربرد دارد
مثل کسی که یه ضرب المثال را بلد باشه اما ندونه کجا ازش استفاده کنه
شرمندم سوالم یه کم عجیب اما خب سوال دیگه !!!!
امید وارم منظورمو رسونده باشم

PC2st
یک شنبه 08 مهر 1386, 17:30 عصر
آقایون من بلدم یک کلاس رو داخل یک کلاس دیگه تعریف کنم ولی نمیدونم این عمل منطقا کی و کجا کربرد دارد
این مطلب رو در تاپیک جدیدی مطرح کنید، بهتر است :-) :لبخندساده:
مثلا تاپیکی با عنوان "لزوم تعریف یک کلاس در کلاس دیگر" یا عنوان "دلیل استفاده از کلاسهای Nested"

alireza_tavakol
دوشنبه 09 مهر 1386, 01:07 صبح
چشم بله قربان
من تابع امر هستم
دیگه تکرار نمیشه