PDA

View Full Version : سوال در مورد Interface ها



nezhadam_pershia
یک شنبه 01 دی 1387, 18:47 عصر
با سلام.
دوستان يک کلاس تصوير را فرض کنيد.هر شيي از اين کلاس خاصيت مشترکي دارد مثل تاريخ توليد نام عکاس و ... و بر اساس نوع عکس(که مي تونه مثلا منظره يا عکس چهره باشد) يک سري خصوصيات غير مشترک دارند.مثلا اگر تصوير چهره باشد بايد نام و نام خانوادگي شخص و اگر منظره باشد بايد نام محل و کشور داراي خاصيت هاي کلاس باشد.
کاري که من کردم تمام خصوصيت ها و متد هاي مشترک کلاس تصوير را به عنوان يک Interface تعريف کردم و کلاس هاي عکس هاي نوع دار از اين کلاس مشتق مي شوند و تمام کلاس هاي مشتق شده به علاوه يک سري خصوصيت مربوط به خود را دارند.
حالا من مي خواهم متدي تعريف بکنم که شيي از هر نوع عکس را به آن با تمام خواص مشترک و غير مشترک آن قبول کند و بر اساس اينکه اين شيي از کدام کلاس است تمام خاصيت ها را در ديتابيس ذخيره کند.

اميدوارم که توانسته باشم به خوبي مسئله تشريح کنم.
mer30

vcldeveloper
دوشنبه 02 دی 1387, 01:22 صبح
لزومی نداشت Interface تعریف کنید. یک کلاس پایه تعریف کنید (مثلا MyBaseClass) که همه خصوصیات و متدهای مشترک را داشته باشه، بعد برای هر نوع خاص از عکس، یک کلاس جدید از نوع پایه مشتق بگیرید، و خصوصیات مخصوص به آن نوع عکس را به آن کلاس اضافه کنید.

یک متد، مربوط به برگرداندن خصوصیات عکس، بصورت Virtual در کلاس پایه تعریف کنید (مثلا SaveClassProps). در کلاس پایه فقط خصوصیات مشترک را با این متد برگردانید، ولی در کلاس های فرزند که این متد را Override می کنند، علاوه بر فراخوانی متد کلاس والد، کدهای مربوط به اضافه کردن مقادیر مختص آن کلاس فرزند را هم اضافه کنید.

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


public void SaveMyClass(MyBaseClass AClass)
{
AClass.SaveClassProps();
}به این ترنیب، هر کلاسی که از MyBaseClass مشتق شده باشد، را می توانید به SaveMyClass بدهید، و با فراخوانی SaveClassPropsآن، کلاس مشخصات خودش را بر می گرداند.
البته می توانید بجای ایجاد یک متد جدید مثل SaveClassProps، متد ToString این کلاس ها را Override کنید، تا کلاس مشخصات خودش را بصورت متن توسط این متد برگرداند، و شما آن را در بانک ذخیره کنید.

s_ahmadneya
دوشنبه 02 دی 1387, 10:43 صبح
با سلام.
دوستان يک کلاس تصوير را فرض کنيد.هر شيي از اين کلاس خاصيت مشترکي دارد مثل تاريخ توليد نام عکاس و ... و بر اساس نوع عکس(که مي تونه مثلا منظره يا عکس چهره باشد) يک سري خصوصيات غير مشترک دارند.مثلا اگر تصوير چهره باشد بايد نام و نام خانوادگي شخص و اگر منظره باشد بايد نام محل و کشور داراي خاصيت هاي کلاس باشد.
کاري که من کردم تمام خصوصيت ها و متد هاي مشترک کلاس تصوير را به عنوان يک Interface تعريف کردم و کلاس هاي عکس هاي نوع دار از اين کلاس مشتق مي شوند و تمام کلاس هاي مشتق شده به علاوه يک سري خصوصيت مربوط به خود را دارند.
حالا من مي خواهم متدي تعريف بکنم که شيي از هر نوع عکس را به آن با تمام خواص مشترک و غير مشترک آن قبول کند و بر اساس اينکه اين شيي از کدام کلاس است تمام خاصيت ها را در ديتابيس ذخيره کند.

اميدوارم که توانسته باشم به خوبي مسئله تشريح کنم.
mer30
من در برنامه هایم برای هر کلاس یه save می نویسم. اینطوری د رهر کلاس که باشیم و save را فراخانی نماییم .عملیات به درستی انجام می شود . اما راه حل اقای کشاورز جالبه من خواهش می کنم روش فوق را عملیاتی وکدش را برای آموزش ما اینجا بگذارید

Amir Oveisi
دوشنبه 02 دی 1387, 11:13 صبح
من در برنامه هایم برای هر کلاس یه save می نویسم. اینطوری د رهر کلاس که باشیم و save را فراخانی نماییم .عملیات به درستی انجام می شود
میشه توضیح بدین بیشتر؟

odiseh
دوشنبه 02 دی 1387, 12:52 عصر
لزومی نداشت Interface تعریف کنید. یک کلاس پایه تعریف کنید (مثلا MyBaseClass) که همه خصوصیات و متدهای مشترک را داشته باشه، بعد برای هر نوع خاص از عکس، یک کلاس جدید از نوع پایه مشتق بگیرید، و خصوصیات مخصوص به آن نوع عکس را به آن کلاس اضافه کنید.

یک متد، مربوط به برگرداندن خصوصیات عکس، بصورت Virtual در کلاس پایه تعریف کنید (مثلا SaveClassProps). در کلاس پایه فقط خصوصیات مشترک را با این متد برگردانید، ولی در کلاس های فرزند که این متد را Override می کنند، علاوه بر فراخوانی متد کلاس والد، کدهای مربوط به اضافه کردن مقادیر مختص آن کلاس فرزند را هم اضافه کنید.

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


public void SaveMyClass(MyBaseClass AClass)
{
AClass.SaveClassProps();
}به این ترنیب، هر کلاسی که از MyBaseClass مشتق شده باشد، را می توانید به SaveMyClass بدهید، و با فراخوانی SaveClassPropsآن، کلاس مشخصات خودش را بر می گرداند.
البته می توانید بجای ایجاد یک متد جدید مثل SaveClassProps، متد ToString این کلاس ها را Override کنید، تا کلاس مشخصات خودش را بصورت متن توسط این متد برگرداند، و شما آن را در بانک ذخیره کنید.

ممکنه لطف کنید و یک مثال ساده رو با توجه به توضیحات بالایی خودتون، ارسال کنید که هر دو روش رو داشته باشه بتونیم ببینیم؟

با تشکر

vcldeveloper
دوشنبه 02 دی 1387, 18:14 عصر
یک دموی ساده ضمیمه کردم. من برنامه نویس #C نیستم، پس انتظار کد پیشرفته ایی را از من نداشته باشید.