PDA

نسخه کامل مشاهده نسخه کامل : تفاوت در سه نوع متفاوت کلاس



Life24
28-08-2013, 22:08
با سلام و وقت بخیر و خسته نباشید خدمت دوستان محترم :n16:

نظر شما در رابطه با تفاوت بین Static class و Private constructor در چیست؟ ما در هر دو نمیتوانیم شی ایجاد کنیم.
پس کاربرد و زمینه استفاده هرکدام چه موقع است؟

تکلیف سازنده استاتیک Static Constructor مشخص هست. 1 بار ایجاد می شود و یا برای مقدار دهی اولیه به اعضای استاتیک به کار می رود
using System;
برای مشاهده محتوا ، لطفا وارد شوید یا ثبت نام کنید

برای مشاهده محتوا ، لطفا وارد شوید یا ثبت نام کنید

_H2_
02-09-2013, 00:39
سلام
این دو کاملاً متفاوت هستند.
در واقع شما فقط و فقط یک شباهت بسیار ناچیز را در یک حالت خاص ملاک گرفته اید.

کلاس های static در واقع اصلاً کلاس نیستند.
در VB با کلمه Module (بجای کلمه Class) تعریف میشوند.
نه ارث از چیزی برده میشوند و نه قابلیت ارث بری دارند.
نه میتوانند رابطی را شامل شوند (فقدان پلی مورفیزم)
نه میتواند نمونه سازی شوند.
نه میتوانند سازنده ای داشته باشند.
(فقط سازنده static میتوانند داشته باشند که در واقع کار وهله یا نمونه سازی را انجام نمیذهد و فقط متغییرهای static را مقداردهی میکند)
و هیچ یک از مصادیق شی گرایی در آن معنا ندارد.
حتی نمیتوانید متغیری از این نوع تعریف کنید.
متغییرها و متدهای این کلاسها همه باید static باشند.
در واقع مدولهای static صرفاً یک ظرف برای توابع مستقلی هستند.

نمونه بسیار بارز یک مدول استاتیک میتواند Math باشد که حاوی توابع مستقل ریاضی است.
توابعی مستقلی مانند Sin و Cos و Abs و... و... که ورودی میگیرند و خروجی را محاسبه میکنند و ارتباط خاصی با شی گرایی هم ندارند.

اگر static وجود نداشت با جادادن توابع مستقلی مانند Sin دچار مشکل میشدم.
برای اینکه عرف حفظ شود و این توابع (مانند ++C) همینطوری در namespace درج شوند، ظرفی فرضی به نام static class برای آنها قرار داده میشود تا در یک پوشه مانندی منظم شوند.

==============

در مقابل کلیه کلاس های دیگر قابلیت نمونه سازی را دارند.
اگر کلاسی سازنده Private داشته باشد، مانند سایر متدهای Private است!
فقط این سازنده از خارج از کدهای کلاس قابل نمونه سازی نیست.
ولی حتماً از کلاس دیگری ارث برده شده (بیان نشود از کلاس Object ارث برده میشود)
میتواند رابطهایی (interface) هایی را شامل شود، متدهایی را override کند.

تنها تفاوتش با سایر کلاس ها همان است که بیان شد، فقط (با روشهای معمول) از بیرون نمیتوان آن را نمونه سازی کرد.
وگرنه خیلی راحت میتوانید متغیرهایی از این جنس کلاس تعریف کنید و اشیا ساخته شده آن (از طرق دیگر) را استفاده و حمل کنید.


یا کلاس های abstract هم گرچه قابل نمونه سازی (New) نیستند ولی بعد از یک وراثت و پیاده سازی متدهای خالی شان، میتوانند نمونه سازی شوند و در متغییرها قرار بگیرند.


در واقع (اگر نام static class را کلاس نگذاریم) در کلاس ها ما تلاش میکنیم تا حد ممکن استفاده از متغییرها و متدهای static را کاهش دهیم.
چون اجزای static گرچه درجای خود مفید هستند ولی خیلی با مفاهیم شی گرایی قابل پیوند و دوستی نیستند و استفاده زیاد و بیرویه از آنها برنامه را به یک برنامه قدیمی روال گرا (که فقط یک سری تابع دارد که پشت سرهم اجرا میشوند) تنزل میدهد.

موفق باشید.