PDA

View Full Version : سوال: جمع عدد با object



ACorvinus
دوشنبه 12 مهر 1389, 12:07 عصر
سلام بچه ها. خوبین؟
من یه مشکل جدی دارم امیدوارم بتونم با کمک شماها حلش کنم.

من یه عددی رو به کلاسی که از IComparable Interface استفاده می کنه ارسال می کنم منتهی الیه توع این عدد رو هم خودم ارسال می کنم.میدونین که چطوری؟!

class Program
{
static void Main(string[] args)
{
xem<long>.x(8976784357879078677);
}

class xem<T> where T : IComparable<T>
{
public static void x(object value)
{
T objectVal = (T)value;
if (Information.IsNumeric(value))
{
if (objectVal.CompareTo((T)k) == -1)
{
//value += 5;
}
}
}
}
}

خب من یه خط از کد فوق رو Comment کردم. در زبان Visual Basic میشه یه عدد رو با object جمع کرد ولی اینجا نمیشه. بدبختانه نوع عدد هم معلوم نیست و به کلاس ارسال میشه. لطفا کمکم کنین کارم گیره همین موضوع هستش.

علیرضا حسن زاده
دوشنبه 12 مهر 1389, 12:13 عصر
می تونی از کلاس Convert استفاده کنی و با تبدیل به int64 خیالت رو از بابت اندازه عدد راحت کنی

ACorvinus
دوشنبه 12 مهر 1389, 12:34 عصر
می تونی از کلاس Convert استفاده کنی و با تبدیل به int64 خیالت رو از بابت اندازه عدد راحت کنی

سلام.
دوست عزیز من نوع عدد رو میفرستم. به این نکته توجه کنین.
در ضمن این کارو کردم ولی خطایی مبنی بر ابنکه نمیشه یه عدد 64 بیتی رو با int جمع کنه رو میده!!!

mehdi.mousavi
دوشنبه 12 مهر 1389, 13:04 عصر
من یه عددی رو به کلاسی که از IComparable Interface استفاده می کنه ارسال می کنم منتهی الیه توع این عدد رو هم خودم ارسال می کنم. خب من یه خط از کد فوق رو Comment کردم. در زبان Visual Basic میشه یه عدد رو با object جمع کرد ولی اینجا نمیشه. بدبختانه نوع عدد هم معلوم نیست و به کلاس ارسال میشه. لطفا کمکم کنین کارم گیره همین موضوع هستش.

سلام.
شما چند راه پیش رو دارید. یکی اینکه overload های مختلف برای تابع x اتون بنویسید:


class xem<T> where T : IComparable<T>
{
public static void x(Int64 value)
{
value += 64;
}

public static void x(long value)
{
value += 64;
}
}


روش دیگه اینه که پارامتر ورودی متود x رو همون Object نگهدارید و در درون اون تابع، بر اساس type اون متغیر، کارتون رو انجام بدید:


class xem<T> where T : IComparable<T>
{
public static void x(object value)
{
if (value is Int64 || value is Int32)
{
Int64 newVal = (Int64)value + 64;
}
}
}


(که بین این دو روش اول ارجحیت داره).

روش دیگه اینه که یک Interface جدید مثل INumber ایجاد کنید و بازای تایپهای مختلف، struct های جدیدی بسازید که همگی INumber رو پیاده سازی کرده اند (که طبیعتا متودهایی مثل Add، Minus و ... روی این Interface باید ایجاد کنید). اینطوری جای اینکه از IComparable کلاستون رو Derive کنید، از INumber اونو Derive خواهید کرد و در درونش، جای Operator += میتونید از Operator هایی که روی INumber تعریف کرده اید استفاده کنید. به بیان دیگه مثلا struct هایی دارید تحت عنوان MyInt32، MyInt64، MyLong و ... که همگی INumber رو پیاده سازی کرده اند.

روش دیگه، استفاده از dynamic keyword در C# 4.0 هستش:


class xem<T> where T : IComparable<T>
{
public static void x(dynamic value)
{
value += 64;
}
}

در این روش، تعیین Data Type پارامتر value تا Runtime به تعویق میفته و شما هر بلایی سر value بیارید، توی runtime نتیجه اش رو میبینید (نه هنگام Compile برنامه). در حال حاضر روش دیگه ای به ذهنم نمیرسه.

موفق باشید.

ACorvinus
دوشنبه 12 مهر 1389, 13:25 عصر
سلام. آقای موسوی بسیار سپاسگذارم. پیاده سازی یک Interface جدید رو عملی می کنم. فقط یه سوال دیگه. آیا میتونم INumber Interface رو از IComparable مشتق کنم؟

mehdi.mousavi
دوشنبه 12 مهر 1389, 13:47 عصر
سلام. آقای موسوی بسیار سپاسگذارم. پیاده سازی یک Interface جدید رو عملی می کنم. فقط یه سوال دیگه. آیا میتونم INumber Interface رو از IComparable مشتق کنم؟

سلام.
خواهش میکنم.... البته که می تونید Interface مورد نظرتون رو از Interface های دیگه Derive کنید.

موفق باشید.