PDA

View Full Version : ارث بردن یک کلاس از دو کلاس به صورت نا همزمان



arashmidos2020
یک شنبه 01 شهریور 1388, 03:20 صبح
سلام.فرض کنید که یک کلاس C دارم که می خوام یکبار از کلاس A ارث ببره و پیاده سازیش کنم و یکبار از کلاس B و بعد تحت این کلاس دوباره پیاده سازیش کنم.و بعد از این چطور تو برنامه ام بگم که شی ای از کلاس C رو بیار که از کلاس A مشتق شده؟



class C :A
{
//Implement
}
class C:B
{
//Implement
}
ممنون

vcldeveloper
یک شنبه 01 شهریور 1388, 03:47 صبح
کلا پیش فرض شما غلط هست؛ مثل این هست که بگید، فرض کنیم یک بچه ایی از یک مادری متولد بشه، بزرگ بشه، بعد ما این رو در رحم یک مادر دیگه بزاریم، دوباره به دنیا بیاریم، و دوباره رشد کنه!

به نظر میاد شما با مفهوم کلاس و وراثت مشکل دارید.

arashmidos2020
یک شنبه 01 شهریور 1388, 05:26 صبح
با تشکر از شما.اما باید یک راه حلی داشته باشه.دقیقا مساله رو الان میگم:
در یک پروژه تحت شبکه من یک کلاس استریم دارم که می خوام یکبار از یک کلاسی که برای سمت کلاینت نوشتم به ارث ببره و پیاده سازیش کنم.و یک بار دیگه می خوام این کلاس استریم رو تحت کلاس سمت سرور بیارم و بنویسم.
حالا مساله اینجاست که هر نود تو شبکه من هم باید سرور باشد و هم کلاینت که در این صورت هست که در یک جا یاید دو پدر داشته باشد.
می دونم قواعد ارث بری به هم می ریزه :لبخندساده: اما واقعا راهی برای اینطور پیاده سازی نیست؟

alireza_tavakol
یک شنبه 01 شهریور 1388, 05:40 صبح
دو تا اینترفیس تعریف کن یکی برای سرور و دیگری رو واسه کلایت

یک کلاس درست کن که هم از IServer و هم از IClient ارث بری داشته باشه

حالا توی کلاست تمام خصوصیات و رفتار های این دو تا اینترفیس رو پیاده سازی کن

اَرژنگ
یک شنبه 01 شهریور 1388, 07:13 صبح
دو تا اینترفیس تعریف کن یکی برای سرور و دیگری رو واسه کلایت

یک کلاس درست کن که هم از IServer و هم از IClient ارث بری داشته باشه

حالا توی کلاست تمام خصوصیات و رفتار های این دو تا اینترفیس رو پیاده سازی کن

وقتی که در مورد اینترفیس حرف میزنند، به جایه ارث بردن از اینترفیس از پیاده کردن اینترفیس صحبت میکنند.
در جاوا این به شکل صریحی با استفاده از کمله بیان میشه، ولی در سی‌شارپ چونکه سینتکس ارث بری از یک کلاس و یا بیان کردن پیاده سازی از یک اینترفیس یک شکل است به اشتباه از ارث بری اینترفیس گفته میشه.
یک روش دیگر گفتن این است که این کلاس از ۲ اینترفیس سرور و کلاینت پشتیبانی میکند.

اینترفیس رفتار و خصوصیت ندارد، بله چه مدت سیگنچرهایی با چه اسمهایه باید کلاسی که ازش میگه پشتیبانی میکند را بیان میکند.

اَرژنگ
یک شنبه 01 شهریور 1388, 10:31 صبح
سلام.فرض کنید که یک کلاس C دارم که می خوام یکبار از کلاس A ارث ببره و پیاده سازیش کنم و یکبار از کلاس B و بعد تحت این کلاس دوباره پیاده سازیش کنم.و بعد از این چطور تو برنامه ام بگم که شی ای از کلاس C رو بیار که از کلاس A مشتق شده؟



class C :A
{
//Implement
}
class C:B
{
//Implement
}
ممنون

از چح جهت به همچین کاری نیاز دارید؟ شاید مشکلی که میخواهید حل کنید روش دیگری نیاز دارد.

arashmidos2020
یک شنبه 01 شهریور 1388, 14:52 عصر
دو تا اینترفیس تعریف کن یکی برای سرور و دیگری رو واسه کلایت

یک کلاس درست کن که هم از IServer و هم از IClient ارث بری داشته باشه

حالا توی کلاست تمام خصوصیات و رفتار های این دو تا اینترفیس رو پیاده سازی کن

با تشکر از دوستانی که در این بحث شرکت کردند.
در اینترفیس که نمی شود پیاده سازی متد ها را انجام داد که شما می گید 2 تا اینترفیس بهکار ببر!.من می خواستم در 2 تا کلاس پدر کلی متد دارم که پیاده سازی شدن که حلا می خوام از اونا به ارث ببرم.درسته اینترفیس برای وراثت چندگانه هم بکار برده می شه اما الان بحث در مورد کلاس ها است

alireza_tavakol
یک شنبه 01 شهریور 1388, 18:01 عصر
شما می توانیید یک کلاس به اسم Server تعریف کنی و تمام اعضای این کلاس رو پیاده ساری کنی . بعد یک کلاس به اسم Client تعریف کنی و تمام اعضای کلاس کلاینت رو پیاده سازی کنی. در نهایت کلاس کلایت از کلاس سرور ارث بری داشته باشه

حالا هر شی که از کلاس کلاینت نمونه سازی بشه تمام خواص کلاس client و server رو یک جا داره .پس هر کامپوتری توسط این شی می تواند هم رول سرویس دهی داشته باشه و هم رول مشتری رو.

اَرژنگ
دوشنبه 02 شهریور 1388, 04:21 صبح
با تشکر از دوستانی که در این بحث شرکت کردند.
در اینترفیس که نمی شود پیاده سازی متد ها را انجام داد که شما می گید 2 تا اینترفیس بهکار ببر!.من می خواستم در 2 تا کلاس پدر کلی متد دارم که پیاده سازی شدن که حلا می خوام از اونا به ارث ببرم.درسته اینترفیس برای وراثت چندگانه هم بکار برده می شه اما الان بحث در مورد کلاس ها است

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

majid325
دوشنبه 02 شهریور 1388, 05:14 صبح
شما میخوای کلاس C در یک حالت شرطی در مواقعی از کلاس B به ارث ببره و در موافعی از کلاس A ؟
اگر درست برداشت کرده باشم!؟
باید از الگوی factory استفاده کنید:
نحوه پیاده سازیش به این صورت هست که هر دو کلاس A و B از کلاس C به ارث میبرن

class A:C
{

}
class B:C
{

}

class C
{

}
در هنگام تصمیم گیری اگر شرط موافق بود برای ایجاد کلاس A

C x = new A();
و اگر شرط موافق بود برای ایجاد کلاس B

C x = new B();

اَرژنگ
دوشنبه 02 شهریور 1388, 05:26 صبح
شما میخوای کلاس C در یک حالت شرطی در مواقعی از کلاس B به ارث ببره و در موافعی از کلاس A ؟
اگر درست برداشت کرده باشم!؟
باید از الگوی factory استفاده کنید:
نحوه پیاده سازیش به این صورت هست که هر دو کلاس A و B از کلاس C به ارث میبرن

class A:C
{

}
class B:C
{

}

class C
{

} در هنگام تصمیم گیری اگر شرط موافق بود برای ایجاد کلاس A

C x = new A();و اگر شرط موافق بود برای ایجاد کلاس B

C x = new B();


Factory Pattern برایه ارث بری شرطی نیست، برایه ساختن شرطی شیئ است. در ضمن از هیچ کدام ارث نمیبره، از یکی از ۲ تا کلاسها ساخته میشه (ارث نمیبرد) .

majid325
دوشنبه 02 شهریور 1388, 06:38 صبح
در ضمن از هردو ارث نمیبره، از یکی و یا دیگری ارث میبره

!!!!!!؟؟؟؟؟؟؟؟

اَرژنگ
دوشنبه 02 شهریور 1388, 08:38 صبح
!!!!!!؟؟؟؟؟؟؟؟

مرسی، واضحتر نوشتم(پست قبلی ویرایش شد):
از هیچ کدام ارث نمیبره، از یکی از ۲ تا کلاسها ساخته میشه .

arashmidos2020
دوشنبه 02 شهریور 1388, 17:59 عصر
شما میخوای کلاس C در یک حالت شرطی در مواقعی از کلاس B به ارث ببره و در موافعی از کلاس A ؟
اگر درست برداشت کرده باشم!؟
باید از الگوی factory استفاده کنید:
نحوه پیاده سازیش به این صورت هست که هر دو کلاس A و B از کلاس C به ارث میبرن

class A:C
{

}
class B:C
{

}

class C
{

} در هنگام تصمیم گیری اگر شرط موافق بود برای ایجاد کلاس A

C x = new A();و اگر شرط موافق بود برای ایجاد کلاس B

C x = new B();

نه دوست عزیز دقیقا عکس الگوی factory رو می خوام داشته باشم.یعنی یک شرطی باشه که یک زمان کلاسم رو از A و زمان دیگر از B به ارث برده باشد.دلیل این پیاده سازی رو هم در پست های قبلیم گفتم(سرور و کلاینت...) .

arashmidos2020
دوشنبه 02 شهریور 1388, 18:13 عصر
قبل از اینکه به استفاده از اینترفیس و یا وراثت بردن از چند کلاس فکر کنیم، او باید مشکلتان را درست درک کنیم. میشه بگید که از این کلاس به چه شکلی میخواهید استفاده کنید؟
ترکیب کردن ۲ کلاس زیاد متفاوت با هر روشی کار درستی نیست، ضد ایده شییگراییست، در شییگرایی هر کلاس متدهایی را که از نظر منطقی به هم ربط دارند را انکپوسلیشن میکند، حالا اگر شما ۲ تا کلاس بیربط را مانند کامیون و گوجه فرنگی را در یک کلاس پیاد کنید (چه با اینترفیس و یا هر روشی) یک چیز بیسرو ته میشه. کلاسهایه متفاوت را باید از هم جدا نگه داشت. مگر اینکه بخواهید با ۲ کلاس که با هم ربطی ندارند به یک شکل ارتباط برقرار کنید، اونوقت از اینترفیس استفاده میشه، مثلا کامیون و گوجه فرنگی هر ۲ قابلیت پرینت کردن بر صفحه را داشته باشند.
حالا شما دنبال چه قابلیتی برایه این ۲ کلاس هستید که میخواهید ادغامشان کنید؟

فکر نمی کنم به مفاهیم شی گرایی آسیبی برسه چون از این طریق می تونیم کلاس های متنوع تری داشته باشیم.فرض کنید جند کلاس داریم با چند نوع پیاده سازی متفاوت از یک متد.حالا یک کلاس فرزند داریم که می خواد با ارث بری از این کلاسها از متدهای متنوع این کلاس ها استفاده کند.این خیلی بهتر از اینه که بیایم یکی یکی تو اون کلاس شی از کلاس های دیگر داشته باشیم و از اونها استفاده کنیم.به نظر شما چه راه حل دیگر برای این کار لحاظ می کنید؟

اَرژنگ
دوشنبه 02 شهریور 1388, 18:29 عصر
فکر نمی کنم به مفاهیم شی گرایی آسیبی برسه چون از این طریق می تونیم کلاس های متنوع تری داشته باشیم.فرض کنید جند کلاس داریم با چند نوع پیاده سازی متفاوت از یک متد.حالا یک کلاس فرزند داریم که می خواد با ارث بری از این کلاسها از متدهای متنوع این کلاس ها استفاده کند.این خیلی بهتر از اینه که بیایم یکی یکی تو اون کلاس شی از کلاس های دیگر داشته باشیم و از اونها استفاده کنیم.به نظر شما چه راه حل دیگر برای این کار لحاظ می کنید؟

اگر جواب این سوالها را نگاه بندازیم به جواب میرسیم:

۱.دلیل استفاده از کلاسها چی هست؟
۲.اگر ارث بری داینامیک شدنی هم باشد، معنی اینکه یک کلاس پیاده سازیهایه مختلفی را داشته باشد به سردرگمی کمک میکند و یا واضح بودن کد؟

۳.روش بهتر همان طوری که جناب علیرضا توکل فرمودند : از استفاده با پشتیبانی اینترفیس میتوانید قابلیتها را در یک کلاس پیاده کنید و با ۲ اینترفیس مختلف با شئی مانند کلاینت و یا سرور رفتار کنید.

اَرژنگ
دوشنبه 02 شهریور 1388, 18:44 عصر
نه دوست عزیز دقیقا عکس الگوی factory رو می خوام داشته باشم.یعنی یک شرطی باشه که یک زمان کلاسم رو از A و زمان دیگر از B به ارث برده باشد.دلیل این پیاده سازی رو هم در پست های قبلیم گفتم(سرور و کلاینت...) .

لطفا از واژه‌هایه درست برایه رساندن مطلب استفاده کنید، ارث بری ربطی به این مسئله ندارد.
کاری که میخواهید انجام بدید ساخت یک ابجکت بر طبق شرائطی از یک کلاس و یا یک کلاس دیگر و یا ارتباط با یک ابجکت همانند اینکه سرور و یا اینکه کلاینت است.

اگر ابجکتی هم میتواند سرور و کلاینت باشد از اینترفیس استفاده کنید، اگر فقط میتواند فـقط یا سرور و یا کلاینت باشد (ولی نه هر دوش در یک زمان)از فکتوری پترن استفاده کنید.
ارث بری داینامیک ربطی به این مسئله ندارد و در سی‌شارپ پشتیبانی نشده.

در ضمن به نظر من هم برایه این مسئله ارتباط برقرار کردن با ابجکت بر طبق اینترفیس کلاینت و یااینترفیس سرور است.


ولی اگر فکر میکنید یک روشی به مزاق شما بهتر است از همان روش استفاده کنید چونکه خودتان باید گسترش و نگهداریش کنید.

اَرژنگ
دوشنبه 02 شهریور 1388, 18:53 عصر
با تشکر از دوستانی که در این بحث شرکت کردند.
در اینترفیس که نمی شود پیاده سازی متد ها را انجام داد که شما می گید 2 تا اینترفیس بهکار ببر!.من می خواستم در 2 تا کلاس پدر کلی متد دارم که پیاده سازی شدن که حلا می خوام از اونا به ارث ببرم.درسته اینترفیس برای وراثت چندگانه هم بکار برده می شه اما الان بحث در مورد کلاس ها است

اینترفیس برایه وراثت چندگانه بکار میره را کجا گفتند؟ اینترفیس برایه کار کردن با قابلیتهایه چندین شکل است نه برایه وراثت.

در ثانی البته که کسی اینترفیس را پیاده نمیکنه، اینترفیس را پشتیبانی میکنند، اگر بگید که یک سرور چه قابلیتهایی دارد ، و قابلیتها را در یک اینترفیس تعریف کنید، کلاستان از اینترفیس حمایت کند و پیاده‌اش کند، میشه با ابجکتی که ازش ساخته میشه مانند اینکه یک سرور کار کرد.
حالا اگر بگید که یک کلاینت چه قابلیتهایی دارد ، و قابلیتها را در یک اینترفیس تعریف کنید، و کلاستان از اینترفیس حمایت کند و پیاده‌اش کند، میشه باهمان ابجکتی که ازش همان کلاس ساخته میشه مانند اینکه یک کلاینت است کار کرد.

از چه لحاظ بحث در مورد کلاسهاست؟ مگر اینترفیس را چی پیاده و یا حمایت و پشتیبانی میکند؟

اَرژنگ
دوشنبه 02 شهریور 1388, 18:55 عصر
شما می توانیید یک کلاس به اسم Server تعریف کنی و تمام اعضای این کلاس رو پیاده ساری کنی . بعد یک کلاس به اسم Client تعریف کنی و تمام اعضای کلاس کلاینت رو پیاده سازی کنی. در نهایت کلاس کلایت از کلاس سرور ارث بری داشته باشه

حالا هر شی که از کلاس کلاینت نمونه سازی بشه تمام خواص کلاس client و server رو یک جا داره .پس هر کامپوتری توسط این شی می تواند هم رول سرویس دهی داشته باشه و هم رول مشتری رو.

جواب قبلیتان جواب درست به این توپیک بود، اجازه ندید مقاومت وپافشاری دیگران باعث این بشه که جواب درستتان را عوض کنید.

arashmidos2020
دوشنبه 02 شهریور 1388, 19:07 عصر
با تشکر از همه دوستان ، جوابم را از صحبتهای شما یافتم. دقیقا این کار باعث سردرگمی و اشتباه شدن در استفاده از کلاسها می شود.ممنون از همه شما عزیزان.

arashmidos2020
دوشنبه 02 شهریور 1388, 19:10 عصر
ارث بری داینامیک.

باتشکر از شما من جواب خودم را گرفتم اما اگر می شود در مورد ارث بری داینامیک کمی بیشتر توضیح دهید و اینکه در چه زبانهایی پیاده سازی شده

اَرژنگ
دوشنبه 02 شهریور 1388, 19:28 عصر
باتشکر از شما من جواب خودم را گرفتم اما اگر می شود در مورد ارث بری داینامیک کمی بیشتر توضیح دهید و اینکه در چه زبانهایی پیاده سازی شده

Dynamically typed languages : Lua, Groovy, JavaScript, Lisp, Objective-C, Perl (with respect to user-defined types but not built-in types), PHP, Prolog, Python, Ruby, Smalltalk and Tcl.

http://en.wikipedia.org/wiki/Type_system