Partial Class

همیشه فکر می‌کردم امکان Partial Class در مورد کلاس‌هایی که خودم می‌نویسم چیز بی‌استفاده‌ای است. تا این که دیروز شرایطی پیش آمد که فقط Partial Class می‌توانست به من کمک کند.

من یک کلاس حجیم، بیش از ۷۰۰ خط داشتم که کار کردن با آن سخت شده بود. خصوصاً این که چند نفر به طور هم‌زمان روی آن کار می‌کردند و همیشه احتمال بروز conflict موقع check-in وجود داشت. علاوه بر این عملکرد متودهای آن را می‌شد به ۲ یا ۳ بخش مستقل تقسیم‌بندی کرد و بهتر بود هر کدام را در جای مستقلی نگه می‌داشتم. بنابراین فکر کردم که تقسیم این کلاس به دو یا چند کلاس دیگر خیلی بهتر است.

این کلاس از نوع Generic است و بیشتر اعضایش از نوع static تعریف شده‌اند. اول کار این طور به نظرم رسید که از Extension Method استفاده کرده و بخش‌های دوم و سوم را به یک کلاس static دیگر برده و عملکرد آنها را از طریق Extension Method مورد استفاده قرار دهم. با این که Extension Methodها با کلاس‌های Generic مشکلی نداشتند، اما چون می‌خواستم از داخل Extension Methodها، متودهای کلاس اصلی را که از نوع static هم بودن را صدا بزنم دچار خطای زیر می‌شدم:

Member ‘SomeMethod()’ cannot be accessed with an instance reference; qualify it with a type name instead

علت خطا همان طور که مشخص است این است که من اجازه ندارم از داخل Extension Methodها، متودهای static را صدا بزنم. ظاهراً دلیل آن این است که با Extension Methodها مشابه متودهای غیر static برخورد می‌شود و فراخوانی متودهای static از داخل آنها ممنوع است.

در اینجا بود که استفاده از Partial Classها به دردم خورد: کلاس مورد نظرم را به چند بخش کوتاه‌تر که از لحاظ عملکرد به هم شبیه بودند تقسیم کردم. این طوری اقلاً حجم فایل کلاس کوتاه‌تر شده و کار تیمی با آن راحت‌تر شد. به مثال MSDN دقت کنید:

public partial class Employee
{
public void DoWork()
{
}
}

public partial class Employee
{
public void GoToLunch()
{
}
}