PDA

View Full Version : نشان دادن یک متد در کلاس های دیگر



com_engineer_ab
دوشنبه 17 خرداد 1389, 00:26 صبح
سلام دوستان
من 3 تا کلاس دارم و می خوام متود هام رو به صورت private تعریف کنم از طرفی می خوام متود های privateرو توی یکی از کلاس هام بتونم ببینم
یادم توی c++ کلاس های friend را تعریف می کردیم
حالا اگه هر کلاس یه dll باشه برای استفاده از متود های private باید چی کار کنم
شنیدم باید از protected به جای private استفاده کرد توی اینترنت و msdn جستجو کردم
کد زیر رو پیدا کردم ولی جوابگو نیست می شه راهنمایی کنید؟؟؟؟

// cs_friend_assemblies.cs
// compile with: /target:library
using System.Runtime.CompilerServices;
using System;
[assembly:InternalsVisibleTo("cs_friend_assemblies_2")]
// internal by default
class Class1
{
public void Test()
{
Console.WriteLine("Class1.Test");
}
}
// public type with internal member
public class Class2
{
internal void Test()
{
Console.WriteLine("Class2.Test");
}
}



// cs_friend_assemblies_2.cs
// compile with: /reference:cs_friend_assemblies.dll /out:cs_friend_assemblies_2.exe
public class M
{
static void Main()
{
// access an internal type
Class1 a = new Class1();
a.Test();
Class2 b = new Class2();
// access an internal member of a public type
b.Test();
}
}

Sajjad.Aghapour
دوشنبه 17 خرداد 1389, 10:05 صبح
بستگی داره شما می خواهید از کدهای خود در یک اسمبلی استفاده کنید یا به صورت گسترده...

اگر درست خاطرم باشه مفهوم friend در ++C معادل مفهوم internal در اینجاست.شما وقتی از internal استفاده میکنید که میخواهید یک object را محدود به یک اسمبلی کنید و فقط در همان اسمبلی از آن استفاده کنید.یعنی میتونیم اینگونه بگیم : "محافظت شده در سطح اسمبلی"
اگر هم دقت کنید:


[assembly:InternalsVisibleTo("cs_friend_assemblies_2")]

این attribute سطح internal را برای اسمبلی cs_friend_assemblies_2 نیز قابل مشاهده میکنه....

protected در ارث بری خودش رو نشون میده.شما از این کلمه وقتی استفاده میکنید که بخواهید یک object رو در دسترس کلاس های وارث قرار بدید...

public هم که گویا هست و نیازی به توضیح نداره...

سوالتون یه خورده نامفهوم بود.به خاطر همین توضیحات رو (هرچند خیلی کوتاه) دادم تا برحسب نیازتون بهترین گزینه رو انتخاب کنید....

cardano7
دوشنبه 17 خرداد 1389, 10:28 صبح
سلام
گقته میشه #C در جهت Pure OO داره حرکت می کنه و نمی خواد با friend کدهاش رو کثیف کنه.
شما چند راه دارید که هیچ کدوم ممکنه اونی نباشه که دوست دارید!
1- استفاده از Internal
2- تغییر آناتومی برنامه طوری که نیاز به این کار نباشه.
3- اگه هدف یک تعداد کمی عضو باشه میشه اونا رو از طریق یک متغیر(برای توابع: یک delegate) از خارج کلاس اونا رو به هم مربوط کنید.

به هر حال سال هاست که برنامه نویسان #C بدون friend کلاس می نویسند. لابد این keyword خیلی حیاتی نیست!

com_engineer_ab
دوشنبه 17 خرداد 1389, 14:22 عصر
[assembly:InternalsVisibleTo("cs_friend_assemblies_2")]

این attribute سطح internal را برای اسمبلی cs_friend_assemblies_2 نیز قابل مشاهده میکنه....
اینی که می گید درست
ولی جوابگو نیست.یعنی وقتی متود یا کلاسم رو توی اسمبلی اول به صورت internal تعریف می کنم دیگه توی اسمبلی دوم نمی شناسه

cardano7
دوشنبه 17 خرداد 1389, 14:54 عصر
[assembly:InternalsVisibleTo("cs_friend_assemblies_2")]

این attribute سطح internal را برای اسمبلی cs_friend_assemblies_2 نیز قابل مشاهده میکنه....
اینی که می گید درست
ولی جوابگو نیست.یعنی وقتی متود یا کلاسم رو توی اسمبلی اول به صورت internal تعریف می کنم دیگه توی اسمبلی دوم نمی شناسه

پس اون راه استفاده از delegate ی که public شده رو امتحان کنید.

com_engineer_ab
دوشنبه 17 خرداد 1389, 14:59 عصر
پس اون راه استفاده از delegate ی که public شده رو امتحان کنید.[/quote]
راستش رو بخواین من از delegate هیچی نمیدونم یه منبع خوب فارسی سراغ دارین؟؟

cardano7
سه شنبه 18 خرداد 1389, 09:42 صبح
راستش رو بخواین من از delegate هیچی نمیدونم یه منبع خوب فارسی سراغ دارین؟؟

بیا خودم منبعم!

یادته که توی C می شد یک تابع را با آدرسش صدا زد؟


myPointer=clrscr;
myPointer(); //calls clrscr


حالا تو C#‎‎‎‎‎ این کار یک مقدار قاعده مند تر شده. یعنی یک delegate می سازیم که نشون میده چه نوع قالبی از توابع رو پشتیبانی می کنه:

public delegate void Print (String s);
در حقیقت یک delegate نوعی تعیریف type برای متغیرهایی هست که به جای داده، مقدارشون برابر یک تابع هست.

البته قبلش مطابق اون قالب چند تابع داریم که نوع و ارگومان هاشون با اون قالب هم خونی داره:

public static void toConsole (String str)
{
Console.WriteLine(str);
}

public static void Display(Print WriteToFile)
{
pMethod("This should be displayed in the console");
}

حالا تو برنامه ی خودمون میاییم و از اون delegate یک یا چند نمونه می سازیم. و به delegate ها مقدار می دهیم. تابع مورد نظر رو به اون نمونه از delegate نسبت می دیم. بعد نمونه از delegate ساخته شده را صدا می زنیم. می بینیم که اون تابع صدا زده میشه.

public static void Main()
{
Print s = new Print (toConsole);
Print v = new Print (toFile);
Display (s);
Display (v);
}

delegate چیز خوبیه. حریم و این جور چیزا سرش نمیشه. public یا private بودن تابع براش مهم نیست. هر چیزی رو که بهش نسبت داده شده باشه رو می تونه صدا بزنه.

اگه این توضیحات کفایت نکرد، ببخشید که وسعمون در همین حد بود. خواستی می تونی google کنی. مطلب زیاده. اگه هم خواستی بیشتر گیج بشی می تونی مثل همیشه سراغ توضیحات MSDN (http://msdn.microsoft.com/en-us/library/ms173171%28v=VS.80%29.aspx) بری.
البته delegate کاربردهای دیگری هم داره. که توی این پست (http://www.barnamenevis.org/forum/showthread.php?p=982205#post982205) بحث شد.