PDA

View Full Version : سوال: تعريف Type جديد با فرض انتخاب string بعنوان Type پايه



رافعی مهدی
چهارشنبه 24 مهر 1387, 20:12 عصر
سلام
ميخواهم يه Type جديد بسازم كه كلاس پايه اش string باشه و بعضي از متدهاي تعريف شده براي يك string مثل Trim و Replace رو در اين Type جديد Override كنم. چطور ميشه اين كار رو كرد؟





RED-C0DE
چهارشنبه 24 مهر 1387, 21:46 عصر
کلاس System.String یک کلاس Sealed هست و نمی تونی ازش ارث ببری...
چه نیازی داری که می خوای از این کلاس ارث ببری؟

Mahdi.Kiani
پنج شنبه 25 مهر 1387, 00:49 صبح
سلام
بعضي از متدهاي تعريف شده براي يك string مثل Trim و Replace رو در اين Type جديد Override كنم. چطور ميشه اين كار رو كرد؟


سلام
می تونین متد هایی را در قالب extension بهش اضافه کنید.

یک مثال (http://weblogs.asp.net/dwahlin/archive/2008/01/25/c-3-0-features-extension-methods.aspx)



namespace StringExtensions
{
public static class StringExtensionsClass
{
public static string RemoveNonNumeric(this string s)
{
MatchCollection col = Regex.Matches(s, "[0-9]");
StringBuilder sb = new StringBuilder();
foreach (Match m in col)
sb.Append(m.Value);
return sb.ToString();
}
}



نحوه استفاده



using StringExtensions;



....
string phone = "123-123-1234";
string newPhone = phone.RemoveNonNumeric();

رافعی مهدی
پنج شنبه 25 مهر 1387, 07:28 صبح
چه نیازی داری که می خوای از این کلاس ارث ببری؟
وقتي در يك string متن فارسي نوشته شده باشه، بعضي از متدها مثل Replace يا Trim اصلاً عمل نميكنند. ولي نميدونم اين مشكله منه يا يه مشكله عموميه. در هر صورت تصميم گرفتم Type جديدي براي string هاي فارسي بسازم و اين جور متدهاش رو خودم بنويسم. البته با مثالي كه آقاي كياني بر اساس Extension Methods معرفي كردند اين مشكل حل شد، مثلاً ميشه متدهايي مثل PersianTrim و غيره رو بهش اضافه كرد.





رافعی مهدی
جمعه 26 مهر 1387, 05:34 صبح
با اينكه مشكل اصلي حل شده ولي اين سوال باقي مونده كه يك Type جديد رو چطور ميشه ساخت، بطوريكه وقتي يه متغير از جنس اين Type ساخته ميشه متدهاي از پيش تعيين شده اي رو بشناسه؟
بعبارت ديگه، بعد از اينكه يك Type جديد مثلاً بشكل زير ساخته ميشه، چطور ميتونيم مشخصات و متدهاي مورد نظرمون رو بهش بشناسونيم؟


Type NewType = typeof(string);
اصلاً تفاوت Type با Class در چيست؟

Mahdi.Kiani
جمعه 26 مهر 1387, 09:22 صبح
سلام
مفهوم کلاس، یک مفهوم انتزاعی به شمار می رود(در همه زبان هایی که این ابزار را در اختیار دارند) و برای مدل سازی هر آنچه که در محیط پیرامون شما وجود دارد به کار می رود. داراری دو بخش کلی هست که در زبان های مختلف باابزرا های مختلف معرفی می کنند و نشانشان می دهند. این دو بخش یکی خصوصیات کلاس و دومی عملیات کلاس.

مفهوم انتزاعی ماشین را در نظر بگیرید:
خوب این مفهوم در دنیای کامپیوتر و برنامه نویسی معنایی نخواهد داست مگر اینکه آن را در قالب یک شی در نظر گرفته و توسط ابزاری که براش در نظر گرفته شده مدل سازی شود.
خوب ماشین خواصی مانند، رنگ، تعداد سیلندر، تعداد چرخ و ... دارد. و عملیاتی که اجام می دهد: روشن شدن، حرکت به جلو، شتاب گرفتن و ...
البته این تعریف ساده ترین و بالا ترین سطحی بود که می شد برای تعریف و مدل سازی یک ماشین داد.
به عنوان مثال هر ماشین، خودش دارای بخش های متعددی است که می توانند، خودشان در غالب کلاس هایی مدل سازی شوند. ( یه عنوان مثال، موتور ماشین، مفهومی است که خودش می تواند مدل سازی های مختلفی داشته وباشد. یا مثلا چرخ) و بخش های دیگر ماشین که هر کدام به تنهایی می تواننند مدل سازی شوند و در نهایت نمونه هایی (instance ها ) از این مدل ها ( کلاس های ساخته شده) در کلاس دیگری جمع شوند تا بتنوانند مفهوم یک ماشین محیط پیرامون را در دنیای کامپیوتر و برنامه نویسی مدل سازی کند.(این همان چیزی است که در مفاهیم مدل سازی با نام Composition relationship می شناسنش- یا به عبارتی مفهوم "part-of" در ارتباط بین اشیاء. (شکل زیر)



http://i36.tinypic.com/i1mm4z.gif



**********
حالا هر چیزی درون سی شارپ دارای یک تایپ هست. متغیر ها، ثوابت، و ...
در واقع Type خودش یک کلاس می باشد برای مشخص کردن نوع اون شی بخصوص. و دسترسی به متا داده های آن.
در واقع با تعریفی که شما کردید در پست قبل، یعنی




Type NewType = typeof(string);




نوع جدیدی به اون معنایی که در ذهن شماست ایجاد نمی گردد. در واقع یک آبجکتی از کلاس Type ایجاد می شود که معرف نوع کلاس String خواهد بود که با آن خواهید توانست به متد ها، خواص و ... که در کلاس String تعریف شده است در runtime دسترسی پیدا کنید.
به عنوان مثال،



Type st = typeof(string);
foreach (System.Reflection.MethodInfo method in st.GetMethods())
{
Console.WriteLine(method);
}




نتیجه :



http://i36.tinypic.com/ajpi75.gif



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

نکته :
برای تعریف یک نوع جدید یکی از راه های زیر را استفاده کنید:
1)از کلاس هایی که قابلیت ارث بری دارند، ارث بری کنید و تغییرات لازم را اعمال کنید
2)ایجاد یک کلاس کاملا جدید و پیاده سازی هر آنچه که نیاز است ( می توانید بسته به نیاز از structure هم استفاده کنید)
3)از امکانات جدیدی که اضافه می شود به دات نت بهره بگیرید ( مثلا Extension Method ها که در پست قبلی اشاره کردم)
4)...

پ و:
در رابطه با مفهوم Composition، مفهوم دیگری به نام Agregation وجوود داره که با عنوان رابطه "has-a" شناخته می شود .

فکر کنم تفاوت بین has-a و part-of به روشنی، تفاوت بین agregate و composit را مشخص میکند.

موفق باشید

رافعی مهدی
شنبه 27 مهر 1387, 08:59 صبح
سلام
آقاي كياني، از اينكه براي پاسخ دادن به سوالم اينقدر وقت صرف كرديد، شرمنده :خجالت: و در عين حال بسيار ممنونم. :لبخندساده:

با توجه به فرمايشات شما برداشت من اينه كه اگر بخواهيم تايپ جديدي مثلاً براي نمايش اعداد مختلط داشته باشيم، ميتونيم از يك struct با سربارگذاري عملگرها استفاده كنيم. راستش من قبلاً اين كار را كرده بودم ولي برام جاي سوال داشت كه آيا كلمه ي كليدي Type داراي چنين قابليتي هست كه با اون بشه يك Type به نام complex ساخت يا نه؟
اگر درست متوجه شده باشم Type چنين كاري نميكنه و تنها براي اشاره به جنس متغيرها و ... بكار ميره و در واقع خصوصيات هر Type از پيش تعريف شده اي براي كامپايلر رو منعكس ميكنه.
بر اين اساس اگر از typeof استفاده نشه، خود Type به تنهايي معني خاصي نميده. ( مثلاً بنويسيم ;Type NewType ) و شايد بتوان گفت كه يك Type فقط مثل يك ظرف براي حمل خصوصيات اشيائي از جنس خودش (تايپ) عمل ميكنه.
لطفاً نظرتون رو راجع به برداشتي كه از اين موضوع دارم بفرماييد.