আমি জানি যে এটি একটি পুরানো প্রশ্ন, তবে একটি শ্রেণিটিকে নেমস্পেস হিসাবে ব্যবহার করার একটি খুব কার্যকর কারণ (যেটিতে একটি অ-স্থিতিশীল) হ'ল সি # প্যারামেট্রিক বা জেনেরিক নেমস্পেসগুলির সংজ্ঞা সমর্থন করে না। আমি এই বিষয়টিতে এখানে একটি ব্লগ পোস্ট লিখেছি : http://tyreejackson.com/generics-net-part5-generic-namespaces/ ।
এর সংক্ষিপ্তসারটি হ'ল বয়লারপ্লেট কোডের বিশাল সোয়াথগুলি বিমূর্ত করার জন্য জেনেরিকগুলি ব্যবহার করার সময়, কখনও কখনও সম্পর্কিত শ্রেণি এবং ইন্টারফেসের মধ্যে একাধিক জেনেরিক পরামিতিগুলি ভাগ করা প্রয়োজন। এটি করার প্রচলিত উপায় হ'ল জেনেরিক পরামিতিগুলি, প্রতিবন্ধকতাগুলি এবং প্রতিটি ইন্টারফেসে এবং শ্রেণি স্বাক্ষরের সমস্তটিকে নতুন করে সংজ্ঞায়িত করা। সময়ের সাথে সাথে এটি প্যারামিটারগুলির প্রসার ঘটাতে পারে এবং এক ধরণের সম্পর্কিত পরামিতিগুলি সম্পর্কিত ধরণের আর্গুমেন্টগুলিকে এক ধরণের থেকে ফরোয়ার্ড করে সংশ্লিষ্ট ধরণের যোগ্যতা অর্জনের বিষয়ে নিয়মিত উল্লেখ না করার ক্ষেত্রে বাধা সৃষ্টি করে।
একটি বাহ্যিক জেনেরিক ক্লাস ব্যবহার করা এবং এর মধ্যে সম্পর্কিত ধরণের বাসা বাঁধাই নাটকীয়ভাবে কোডটি DRY আপ করতে পারে এবং এর বিমূর্তকরণকে সহজতর করতে পারে। এরপরে কেউ একটি কংক্রিট বাস্তবায়নের সাথে প্যারামেট্রিক নেমস্পেস ক্লাস অর্জন করতে পারে যা কংক্রিটের সমস্ত বিবরণ সরবরাহ করে।
এখানে একটি তুচ্ছ উদাহরণ:
public class Entity
<
TEntity,
TDataObject,
TDataObjectList,
TIBusiness,
TIDataAccess,
TIdKey
>
where TEntity : Entity<TEntity, TDataObject, TDataObjectList, TIBusiness, TIDataAccess, TIdKey>, subclassed
where TDataObject : Entity<TEntity, TDataObject, TDataObjectList, TIBusiness, TIDataAccess, TIdKey>.BaseDataObject, subclassed
where TDataObjectList : Entity<TEntity, TDataObject, TDataObjectList, TIBusiness, TIDataAccess, TIdKey>.BaseDataObjectList, subclassed
where TIBusiness : Entity<TEntity, TDataObject, TDataObjectList, TIBusiness, TIDataAccess, TIdKey>.IBaseBusiness
where TIDataAccess : Entity<TEntity, TDataObject, TDataObjectList, TIBusiness, TIDataAccess, TIdKey>.IBaseDataAccess
{
public class BaseDataObject
{
public TIdKey Id { get; set; }
}
public class BaseDataObjectList : Collection<TDataObject> {}
public interface IBaseBusiness
{
TDataObject LoadById(TIdKey id);
TDataObjectList LoadAll();
void Save(TDataObject item);
void Save(TDataObjectList items);
void DeleteById(TIdKey id);
bool Validate(TDataObject item);
bool Validate(TDataObjectList items);
}
public interface IBaseDataAccess
{
TDataObject LoadById(TIdKey id);
TDataObjectList LoadAll();
void Save(TDataObject item);
void Save(TDataObjectList items);
void DeleteById(TIdKey id);
}
}
এর মতো ব্যবহৃত:
public class User
:
Entity
<
User,
User.DataObject,
User.DataObjectList,
User.IBusiness,
User.IDataAccess,
Guid
>
{
public class DataObject : BaseDataObject
{
public string FirstName { get; set; }
public string LastName { get; set; }
}
public class DataObjectList : BaseDataObjectList {}
public interface IBusiness : IBaseBusiness
{
void DeactivateUserById(Guid id);
}
public interface IDataAcccess : IBaseDataAccess {}
}
এর মতো ডেরিভেটিভস গ্রহণ করুন:
public class EntityConsumer
{
private User.IBusiness userBusiness;
private Permission.IBusiness permissionBusiness;
public EntityConsumer(User.IBusiness userBusiness, Permission.IBusiness permissionBusiness) { /* assign dependencies */ }
public void ConsumeEntities()
{
var users = new User.DataObjectList();
var permissions = this.permissionBusiness.LoadAll();
users.Add
(new User.DataObject()
{
// Assign property values
});
this.userBusiness.Save(users);
}
}
এই ধরণের লেখার সুবিধাটি হ'ল প্রকারের সুরক্ষা এবং বিমূর্ত ক্লাসে প্রকারের কম কাস্টিং যুক্ত করা হয়। এটি বৃহত্তর স্কেলে ArrayList
বনামের সমতুল্য List<T>
।