मुझे पता है कि यह एक पुराना प्रश्न है, लेकिन एक वर्ग को नाम स्थान (उस पर एक गैर-स्थिर) के रूप में उपयोग करने का एक बहुत ही वैध कारण यह है कि C # पैरामीट्रिक या जेनेरिक नेमस्पेस की परिभाषा का समर्थन नहीं करता है। मैंने यहाँ इस विषय पर एक ब्लॉग पोस्ट लिखी है: http://tyreejackson.com/generics-net-part5-generic-namespaces/ ।
इसका सार यह है कि जब बॉयलरप्लेट कोड के विशाल स्वाथों के लिए जेनेरिक का उपयोग किया जाता है, तो संबंधित वर्गों और इंटरफेस के बीच कई सामान्य मापदंडों को साझा करना कभी-कभी आवश्यक होता है। ऐसा करने का पारंपरिक तरीका प्रत्येक इंटरफ़ेस और वर्ग हस्ताक्षर में जेनेरिक मापदंडों, बाधाओं और सभी को फिर से परिभाषित करना होगा। समय के साथ यह मापदंडों और बाधाओं का प्रसार हो सकता है, जिसमें संबंधित प्रकारों को एक प्रकार से संबंधित प्रकार के तर्कों के लिए आगे के प्रकारों को अग्रेषित करने के लिए लगातार उल्लेख करने के लिए नहीं होना चाहिए।
बाहरी जेनेरिक क्लास का उपयोग करना और संबंधित प्रकारों को भीतर करना नाटकीय रूप से कोड को कम कर सकता है और इसके अमूर्त को सरल बना सकता है। एक तो एक ठोस कार्यान्वयन के साथ पैरामीट्रिक नाम स्थान वर्ग प्राप्त कर सकता है जो सभी ठोस विवरणों की आपूर्ति करता है।
यहाँ एक तुच्छ उदाहरण है:
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>
।