উপরে তালিকাভুক্ত অন্যান্য কারণগুলি ছাড়াও, এর আরও একটি কারণ রয়েছে যা আমি কেবল নেস্টেড ক্লাসগুলিই ব্যবহার করার কথা ভাবতে পারি না, তবে প্রকৃতপক্ষে পাবলিক নেস্টেড ক্লাসগুলিও ব্যবহার করতে পারি। একই জেনেরিক ধরণের পরামিতিগুলি ভাগ করে নেওয়ার জন্য একাধিক জেনেরিক ক্লাসগুলির সাথে যারা কাজ করেন তাদের পক্ষে জেনেরিক নেমস্পেস ঘোষণা করার ক্ষমতা অত্যন্ত কার্যকর be দুর্ভাগ্যক্রমে,। নেট (বা কমপক্ষে সি #) জেনেরিক নেমস্পেসের ধারণাটিকে সমর্থন করে না। সুতরাং একই লক্ষ্য অর্জনের জন্য, আমরা একই লক্ষ্য অর্জনের জন্য জেনেরিক ক্লাস ব্যবহার করতে পারি। একটি যৌক্তিক সত্তা সম্পর্কিত নিম্নলিখিত ক্লাস গ্রহণ করুন:
public class BaseDataObject
<
tDataObject,
tDataObjectList,
tBusiness,
tDataAccess
>
where tDataObject : BaseDataObject<tDataObject, tDataObjectList, tBusiness, tDataAccess>
where tDataObjectList : BaseDataObjectList<tDataObject, tDataObjectList, tBusiness, tDataAccess>, new()
where tBusiness : IBaseBusiness<tDataObject, tDataObjectList, tBusiness, tDataAccess>
where tDataAccess : IBaseDataAccess<tDataObject, tDataObjectList, tBusiness, tDataAccess>
{
}
public class BaseDataObjectList
<
tDataObject,
tDataObjectList,
tBusiness,
tDataAccess
>
:
CollectionBase<tDataObject>
where tDataObject : BaseDataObject<tDataObject, tDataObjectList, tBusiness, tDataAccess>
where tDataObjectList : BaseDataObjectList<tDataObject, tDataObjectList, tBusiness, tDataAccess>, new()
where tBusiness : IBaseBusiness<tDataObject, tDataObjectList, tBusiness, tDataAccess>
where tDataAccess : IBaseDataAccess<tDataObject, tDataObjectList, tBusiness, tDataAccess>
{
}
public interface IBaseBusiness
<
tDataObject,
tDataObjectList,
tBusiness,
tDataAccess
>
where tDataObject : BaseDataObject<tDataObject, tDataObjectList, tBusiness, tDataAccess>
where tDataObjectList : BaseDataObjectList<tDataObject, tDataObjectList, tBusiness, tDataAccess>, new()
where tBusiness : IBaseBusiness<tDataObject, tDataObjectList, tBusiness, tDataAccess>
where tDataAccess : IBaseDataAccess<tDataObject, tDataObjectList, tBusiness, tDataAccess>
{
}
public interface IBaseDataAccess
<
tDataObject,
tDataObjectList,
tBusiness,
tDataAccess
>
where tDataObject : BaseDataObject<tDataObject, tDataObjectList, tBusiness, tDataAccess>
where tDataObjectList : BaseDataObjectList<tDataObject, tDataObjectList, tBusiness, tDataAccess>, new()
where tBusiness : IBaseBusiness<tDataObject, tDataObjectList, tBusiness, tDataAccess>
where tDataAccess : IBaseDataAccess<tDataObject, tDataObjectList, tBusiness, tDataAccess>
{
}
আমরা জেনেরিক নেমস্পেস (নেস্টেড ক্লাসগুলির মাধ্যমে প্রয়োগ করা) ব্যবহার করে এই শ্রেণীর স্বাক্ষরগুলি সহজ করতে পারি:
public
partial class Entity
<
tDataObject,
tDataObjectList,
tBusiness,
tDataAccess
>
where tDataObject : Entity<tDataObject, tDataObjectList, tBusiness, tDataAccess>.BaseDataObject
where tDataObjectList : Entity<tDataObject, tDataObjectList, tBusiness, tDataAccess>.BaseDataObjectList, new()
where tBusiness : Entity<tDataObject, tDataObjectList, tBusiness, tDataAccess>.IBaseBusiness
where tDataAccess : Entity<tDataObject, tDataObjectList, tBusiness, tDataAccess>.IBaseDataAccess
{
public class BaseDataObject {}
public class BaseDataObjectList : CollectionBase<tDataObject> {}
public interface IBaseBusiness {}
public interface IBaseDataAccess {}
}
তারপরে, এরিক ভ্যান ব্র্যাকেলের প্রস্তাবিত আংশিক ক্লাস ব্যবহারের মাধ্যমে পূর্বের মন্তব্যে, আপনি ক্লাসগুলি পৃথক নেস্টেড ফাইলগুলিতে আলাদা করতে পারবেন। আংশিক শ্রেণীর ফাইলগুলিকে বাসা বাঁধতে সমর্থন করার জন্য আমি নেস্টইনের মতো ভিজ্যুয়াল স্টুডিও এক্সটেনশনটি ব্যবহার করার পরামর্শ দিচ্ছি। এটি "নেমস্পেস" শ্রেণীর ফাইলগুলিকে নেস্টেড ক্লাস ফাইলগুলিকে এভাবে ফোল্ডারে সংগঠিত করতে ব্যবহার করতে সহায়তা করে।
উদাহরণ স্বরূপ:
সত্ত্বা
public
partial class Entity
<
tDataObject,
tDataObjectList,
tBusiness,
tDataAccess
>
where tDataObject : Entity<tDataObject, tDataObjectList, tBusiness, tDataAccess>.BaseDataObject
where tDataObjectList : Entity<tDataObject, tDataObjectList, tBusiness, tDataAccess>.BaseDataObjectList, new()
where tBusiness : Entity<tDataObject, tDataObjectList, tBusiness, tDataAccess>.IBaseBusiness
where tDataAccess : Entity<tDataObject, tDataObjectList, tBusiness, tDataAccess>.IBaseDataAccess
{
}
সত্তা.বেসডাটাঅবজেক্ট.সি
partial class Entity<tDataObject, tDataObjectList, tBusiness, tDataAccess>
{
public class BaseDataObject
{
public DataTimeOffset CreatedDateTime { get; set; }
public Guid CreatedById { get; set; }
public Guid Id { get; set; }
public DataTimeOffset LastUpdateDateTime { get; set; }
public Guid LastUpdatedById { get; set; }
public
static
implicit operator tDataObjectList(DataObject dataObject)
{
var returnList = new tDataObjectList();
returnList.Add((tDataObject) this);
return returnList;
}
}
}
সত্তা.বেসডাটাঅবজেক্টলিস্ট
partial class Entity<tDataObject, tDataObjectList, tBusiness, tDataAccess>
{
public class BaseDataObjectList : CollectionBase<tDataObject>
{
public tDataObjectList ShallowClone()
{
var returnList = new tDataObjectList();
returnList.AddRange(this);
return returnList;
}
}
}
সত্তা.আইব্যাসব্যবসনেসি
partial class Entity<tDataObject, tDataObjectList, tBusiness, tDataAccess>
{
public interface IBaseBusiness
{
tDataObjectList Load();
void Delete();
void Save(tDataObjectList data);
}
}
সত্তা.আইবেসডেটা অ্যাক্সেস.সি
partial class Entity<tDataObject, tDataObjectList, tBusiness, tDataAccess>
{
public interface IBaseDataAccess
{
tDataObjectList Load();
void Delete();
void Save(tDataObjectList data);
}
}
ভিজ্যুয়াল স্টুডিও সলিউশন এক্সপ্লোরারের ফাইলগুলি এরপরে এইভাবে সংগঠিত হবে:
Entity.cs
+ Entity.BaseDataObject.cs
+ Entity.BaseDataObjectList.cs
+ Entity.IBaseBusiness.cs
+ Entity.IBaseDataAccess.cs
এবং আপনি জেনেরিক নেমস্পেস নিম্নলিখিতগুলির মতো প্রয়োগ করবেন:
ব্যবহারকারীর
public
partial class User
:
Entity
<
User.DataObject,
User.DataObjectList,
User.IBusiness,
User.IDataAccess
>
{
}
ব্যবহারকারী.ডাটাঅবজেক্ট.সি
partial class User
{
public class DataObject : BaseDataObject
{
public string UserName { get; set; }
public byte[] PasswordHash { get; set; }
public bool AccountIsEnabled { get; set; }
}
}
ব্যবহারকারী.ডাটাঅবজেক্টলিস্ট
partial class User
{
public class DataObjectList : BaseDataObjectList {}
}
ব্যবহারকারী.আইবসনেস.সি
partial class User
{
public interface IBusiness : IBaseBusiness {}
}
ব্যবহারকারী.আইডিটাএ্যাক্সেস.সি
partial class User
{
public interface IDataAccess : IBaseDataAccess {}
}
ফাইলগুলি সমাধান এক্সপ্লোরারগুলিতে নিম্নরূপভাবে সংগঠিত হবে:
User.cs
+ User.DataObject.cs
+ User.DataObjectList.cs
+ User.IBusiness.cs
+ User.IDataAccess.cs
উপরেরটি একটি জেনেরিক নেমস্পেস হিসাবে বাইরের শ্রেণি ব্যবহারের একটি সাধারণ উদাহরণ example আমি অতীতে 9 বা ততোধিক ধরণের পরামিতিগুলি ধারণ করে "জেনেরিক নেমস্পেস" তৈরি করেছি। এই ধরণের পরামিতিগুলিকে নয়টি ধরণের সিঙ্ক্রোনাইজ করে রাখার জন্য যা টাইপ পরামিতিগুলি জানতে প্রয়োজনীয় সমস্ত ক্লান্তিকর ছিল, বিশেষত একটি নতুন পরামিতি যুক্ত করার সময়। জেনেরিক নেমস্পেসের ব্যবহার সেই কোডটিকে আরও বেশি পরিচালনাযোগ্য এবং পঠনযোগ্য করে তোলে।