PDA

View Full Version : ارث بری - عدم ارث بردن ویژگی بخصوص



bad_boy_2007
سه شنبه 09 مرداد 1386, 19:32 عصر
سلام دوستان
من یک مشکل با ارث بری دارم . من تعدادی فرم و کلاس دارم که میخوام واسه راحتی کارم از ارث بری واسه اونا استفاده کنم بزار یکیشونو مثال میزنم .
مثلا فرم دریافت مشخصات فردی و فرم ویرایش مشخصات فرد دقیقا یک فرم است و رویه های انتقال فکوس ، نام کلیدها ، ایندکس و . . . همه و همه یکیه غیر از رویداد lOAD شدن فرمها و کلید ثبت اطلاعات . حالا میخوام یک فرم طراحی کنم که تمام این ویژگی ها رو داشته باشه مثلا فرم افزودن ولی نمیخوام ویژگی فشرده شدن کلید ثبت در فرم دیگر از فرم اصلی به ارث برده بشه .
واسه حل این مشکل یک فرم کل در نظر گرفتم که تمامی ویژگیهای مشترکشون رو داره و برای هر کدام از فرمهام از فرم اصلی ویژگیها رو به ارث بردم ولی اینطور باید 3 فرم طراحی بشه ، میخواستم بدونم راه ساده تری هم هست که یک ویژگی در فرمهای دیگه به ارث برده نشه ؟

odiseh
چهارشنبه 10 مرداد 1386, 08:25 صبح
بله میشه......اینطوری که اون پروسیجری رو که میخوای توی فرم دیگه وجود نداشته باشه (مثلا کلیک دکمه ثبت) به فرم Overridable در فرم پایه تعریف کن و بعد در فرم جدید اون رو اون طوریکه می خوای بذار....

راه دوم اینه که اون روتین رو به شکل shadows تعریف کنی.

__H2__
چهارشنبه 10 مرداد 1386, 10:24 صبح
سلام


راه دوم اینه که اون روتین رو به شکل shadows تعریف کنی.
همانطور که خودتان هم احتالاً میدانید این کلمه کلیدی باعث وراثت و ارتباط نمیشه!
در نتیجه هرچه کمتر استفاده شود بهتر است! (البته در برخی موارد لازم میشود، مثلاً خود فریمک وروک در تعریف شی Command از ان استفاده کرده)

مثلاً در مورد همون دکمه اگر شما رویداد اجرذا شدنش را به صورت Overridable تعریف کنید و در کلاسس مشتق با overrides ان را باز تعریف کنید، با فشرده شدن دکمه کد جدید شما در کلاسس مشتق شده اجرا میشود(همانطور که کاربر bad_boy_2007 میخواهند) ولی با Shadows همچین اتفاقی نمی افتد! با Shadows شما دو تابع مختلف خواهید داشت که به خودی خود هیچ ارتباطی با هم ندارند فقط نامشان یکی است و جدیده قبلی را پوشانده و مخفی کرده.

titbasoft
چهارشنبه 10 مرداد 1386, 10:55 صبح
شاید این دو تا تاپیک بدرد بخورن:
http://barnamenevis.org/forum/showpost.php?p=98719&postcount=12
http://barnamenevis.org/forum/showthread.php?t=52644

odiseh
چهارشنبه 10 مرداد 1386, 12:28 عصر
با Shadows شما دو تابع مختلف خواهید داشت که به خودی خود هیچ ارتباطی با هم ندارند فقط نامشان یکی است و جدیده قبلی را پوشانده و مخفی کرده.

سلام

قبول. ولی این دوست ما می خوان در فرم مشتق شده کار قبلی که در فرم پایه انجام میشه انجام نشه.

اگه بخوان که به جاش کار جدیدی انجام بگیره پس Overrides می کنن.
اما اگه نخوان کار جدیدی انجام بگیره، میتونن با Shadows جلوی کار قبلی رو در فرم مشتق شده بگیرن.
درست میگم؟

bad_boy_2007
سه شنبه 16 مرداد 1386, 23:39 عصر
ممنون ار زاهنماییتون تابع مورد نظرم رو OverRides کردم و مشکلم فعلا حل شده ولی میشه در مورد Shadow هم توضیح بدید که چیکار میکنه ؟

__H2__
چهارشنبه 17 مرداد 1386, 09:25 صبح
سلام
دوست عزیزمان کاربر odiseh (http://barnamenevis.org/forum/member.php?u=21975) هم گفتند و درست است.
مجدداً جمله خودم را که در پست 3 گفته بودم تکرار میکنم، چون نمیتوانم بهتر بگویم!
با اگر شما میخواهید تابع یا متدی هم نام با متد یا تابعی از کلاسس پایه داشته باشید که هیچ ارتباط خاصی هم با نمونه پایه اش ندارد، یعنی شما میخواهید نامی را استفاده کنید ولی قبل از شما کلاسس پایه آن نام رات برای کاری استفاده کرده، شما میتوانید با Shadows به زور نام را استفاده کنید.!
و تا وقتی که اشاره گر از نوع کلاسس شما است متد یا تابع جدید شما با نامی که شما تایین کرده اید اجرا میشود.

اگر دوستان بهتر میتوانند توضیح دهند که مطلب برای این دوستمان روشن تر شود چه بهتر!
موفق باشید.

bad_boy_2007
چهارشنبه 17 مرداد 1386, 14:13 عصر
ببینید دوستان من به هر دو کار نیاز دارم هم رویدادی دارم که نمیخوام تو فرمی که به ارث میبره ، به ارث برده بشه و هم میخوام یک رویداد خاص تو فرمی که به ارث میبره کار دیگه ای انجام بده با کمک دوستان عزیز که OverRides رو معرفی کردن تونستم یک تابع رو Overridable کنم ولی در مورد Shadows موفق نشدم این کار رو بکنم .


سلام
اگه بخوان که به جاش کار جدیدی انجام بگیره پس Overrides می کنن.
اما اگه نخوان کار جدیدی انجام بگیره، میتونن با Shadows جلوی کار قبلی رو در فرم مشتق شده بگیرن.
درست میگم؟
این کدی است که من نوشتم ولی تو فرم 2 که ویژگیهاش رو از فرم 1 به ارث میبره تو رویداد فرم لود پیغام مسیج باکس نمایش داده میشه ، میخواستم بدونم دلیلش چیه ؟

PrivateShadowsSub Form1_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) HandlesMyBase.Load
MsgBox("form1")
EndSub

__H2__
چهارشنبه 17 مرداد 1386, 16:21 عصر
سلام
یک چیز دیگر هم بگویم بد نیست
من دو تابع با نام Function P1 As Integer و Function P2 As Integer دارم، اولی درکلاسس پایه و دومی در کلاسس مشتق شده، این دو تابع مطلقاً هیچ ربطب به هم ندارد و نامشان هم فرق دارد!
حالا ن تصمیم میگرم که نام دومی راکه P2 بود بگذارم P1 ولی VS خط میدهد و میگوید این نام قبلا در کلاسس پایه استفاده شده، من اگر باز هم اصرار داشته باشم که همچنان نام تابع P2 خودم را P1 بگذارم میتوانم با اوردن لغت Shadows این کار را بکنم، در نهایت دو تابع دارم که میتوانند هیچ ربطی به هم نداشته باشند و اولی درکلاسس پایه است و دومی در کلاشش مشتق، یعنی میتوان گفت یک جوایی لغت Shadows برای من کار Rename را انجام داد!
امیدوارم متوجه شده بشید.



این کدی است که من نوشتم ولی تو فرم 2 که ویژگیهاش رو از فرم 1 به ارث میبره تو رویداد فرم لود پیغام مسیج باکس نمایش داده میشه ، میخواستم بدونم دلیلش چیه ؟


Handles MyBase.Load
(نام اصلاً مهم نیست و هرچه باشد باز هم اجرا میشود، درست برخلاف VB6، بلکه دستور فوق است که میگوید با مثلاً لود شدن فرم این زیر برنام اجرا شود.)

bad_boy_2007
چهارشنبه 17 مرداد 1386, 18:14 عصر
دستت درد نکنه _H2_ عزیز
تازه فهمیدم اوضاع از چه قراره !!! یه چیزی تو مایه های فضای نام محلی :لبخند:
حالا اگه نخوام تو فرمی که ویژگیهاش رو از فرم پدرش به ارث میبره یک کلید یا تکس باکس رو به ارث نبره چی ؟ یعنی یک کنترل تو کلاس پایه باشه ولی تو کلاس مشتق نباشه ، من واسه این کار فعلا Visible رو False کردم ولی میشه راهنمایی کنید که راه دیگه ای وجود داره یا خیر ؟

__H2__
پنج شنبه 18 مرداد 1386, 09:18 صبح
سلام
در مورد کنترلر تنها راهتان بجز Visible که اگر یک دونه باشد بد هم نیست(!) حذف کنترلر است.
چون اصلاً در بنیان کنترلر ها در یک Collection نگه داری میشوند و آن Collection است که به ارث برده میشود نه محتویاتش!
دلیل آنکه فرم شما شامل کنترلهای فرم پایه است آن است که در New شدن کلاسس پایه این کنترلرها به Collection اضافه (Add) میشوند و شما هم میتوانید در New شدن یا Form_Load فرم خودتان آن را Remove کنید! البته دیگر به هیج وجه نباید از کنترلر مذکور استفاده کنید. (Me.Controls.Remove(Me.btnOK

ولی راه فوق زیاد جالب نیست و فقط راحت تر است! چون شما یک کنترلر را میسازید و بعد نابودش میکنید!!!!!!

اگر بر وجود کنترلر در فرم پایه اصرار دارید، بهترین راه ارسال پارامتری به سازنده فرم پایه است (مثلاً یک Boolean) که بگوید کنترلر مورد نظر را New کند یا نه! کمی سخت است ولی به نظر من خیلی بهتر و سریعتر است.