PDA

View Full Version : سوال: دسترسی به پارامتر یک متد از یک متد دیگر بدون متغیر سراسری



Itist82
یک شنبه 09 فروردین 1388, 13:29 عصر
سلام
توی کد زیر و برای متد اول (و همین طور دومی) چی بنویسم تا در متد دوم بشه از نوع داده ای که اینجا گرفته شده یه شی ساخت؟ فرض کنید هر نوع داده ای هم که گرفته باشه از کلاس clBase ارث ببره. یعنی توی متد اول نوع داده ی یه کلاس تعریف شده توسط کاربر گرفته می شه.
مثلا اگه با متد اول نوع داده ی clMyType انتخاب شد متد دوم باید شی ای از همون نوع بسازه و برگردونه.
از هیچ متغیر سراسری هم نمی خوام استفاده کنم و متد ها باید همین جوری استاتیک باشند



public class class1
{
public static void getTheType(Type theType)
{


}
public static clBase theObject()
{


return new …
}
}

Itist82
یک شنبه 09 فروردین 1388, 17:53 عصر
من که نفهمیدم چی شد. میشه کمی واضح تر بگی!!!

شما فرض کنید اون دو تا متد درست پیاده سازی شدن، حالا در کد زیر شی myObj باید از نوع clMyType باشه:


class1.getTheType(typeOf(clMyType));
clBase myObj = class1.theObject();چون گفتم همه ی نوع ها از clBase ارث می برند.
در واقع من کدی رو دیدم که این کار رو می کنه اما فقط می دونم این متد ها رو داره، پیاده سازیشو ندیدم به همین خاطر دارم سعی می کنم حدس بزنم چی کار کرده.
ممنون از توجهتون

Mehdi Asgari
یک شنبه 09 فروردین 1388, 19:00 عصر
این یه راه که به ذهنم رسید:


using System;

namespace ConsoleApplication2
{
public abstract class BaseClass
{
public abstract void PrintMyName();
}

public class Derived1 : BaseClass
{
public override void PrintMyName()
{
Console.WriteLine("Derived1");
}
}

public class Derived2 : BaseClass
{
public override void PrintMyName()
{
Console.WriteLine("Derived2");
}
}

public class Class1 <T>
{
private static Type t;

public static void getTheType(Type theType)
{
t = theType;
}

public static T theObject()
{
var constructor = t.GetConstructor(new Type[] { });
return (T) constructor.Invoke(new object[] { });
}
}

class Program
{
static void Main(string[] args)
{
Class1<BaseClass>.getTheType(typeof(Derived1));
BaseClass myObj = Class1<BaseClass>.theObject();
myObj.PrintMyName();
}
}
}


احتمالا راه های دیگه ای (ساده تر؟) هم موجود باشه (چون از اولم معلوم بود که با Reflection میشه سریع به جواب رسید ، ولی نمی دونم روش سرراست تری هم هست ؟!)

(این روش فقط برای این حالت خاص جواب میده ، وگرنه اگه سازنده ها پارامتری باشن کد کمی پیچیده تر خواهد شد)

Itist82
پنج شنبه 13 فروردین 1388, 23:30 عصر
خیلی ممنون از پاسخ قشنگتون چیزای خوبی از کدتون یاد گرفتم، بله می تونه یه جور راه حل باشه اما توی عنوان بحث هم گفتم بدون متغیر سراسری. یعنی همون t که توی کلاس Class1 گرفتید. البته منم واقعا نمی دونم اگه اونو نگیریم چی کار باید کرد.
می دونید این کدی که من یه خورده اش رو دیدم درواقع یه dll بود که ویژوال استودیو فقط عنوان توابع رو نشون می ده (که خلاصه شده اش درست این شکلی بود که توی پست اول نوشتم. مگر اینکه متغیرهایی باشن که تعریف شدن اما ویژوال استودیو نشون نده) و بعد جاهای دیگه ای توی قسمتهایی از کد که روال رویداد ها بود و کد رو می شد دید دیدم اول نوع رو به اون تابع اولی داده و بعد با اون تابع دومی نمونه سازی کرده. حالا اگه بازم شما یا بقیه دوستان چیزی به ذهنشون رسید ممنون می شم بگید / بگن.

Mehdi Asgari
جمعه 14 فروردین 1388, 00:53 صبح
شاید متغیر اون ها private بوده یا شما ندیدیدش یا ..
(می تونید dll یا کد رو بذارید اینجا ببینیم)
(به هر حال اطلاعات باید جایی ذخیره بشن یا نه ؟ سناریو هم طوری نیست که بشه مثلا از coroutine ها استفاده کرد)

Mahdi.Kiani
جمعه 14 فروردین 1388, 09:54 صبح
سلام
خوب چه نیازی هست که حتما متد اول وجود داشته باشه؟
یک کیلاس generic با متدی مثل GetInstance :



public class GenericObject<T> where T : BaseClass, new()
{
public static T GetInstance()
{
return new T();
}
}