Tôi biết rằng đây là một câu hỏi cũ, nhưng một lý do rất hợp lệ để sử dụng một lớp làm không gian tên (không phải là tĩnh tại đó) là C # không hỗ trợ định nghĩa về không gian tên tham số hoặc chung. Tôi đã viết một bài đăng trên blog về chính chủ đề này ở đây: http://tyreejackson.com/generics-net-part5-generic-namespaces/ .
Ý chính của nó là, khi sử dụng khái quát để trừu tượng các chuỗi mã soạn sẵn, đôi khi cần phải chia sẻ nhiều tham số chung giữa các lớp và giao diện liên quan. Cách thông thường để làm điều này sẽ là xác định lại các tham số chung, các ràng buộc và tất cả trong mỗi giao diện và chữ ký lớp. Theo thời gian, điều này có thể dẫn đến sự phổ biến các tham số và các ràng buộc không đề cập đến việc liên tục phải đủ điều kiện các loại liên quan bằng cách chuyển tiếp các tham số loại từ một loại sang các đối số loại của loại liên quan.
Sử dụng một lớp Generic bên ngoài và lồng các kiểu liên quan bên trong có thể DRY mã lên một cách đáng kể và đơn giản hóa sự trừu tượng hóa của nó. Sau đó, người ta có thể rút ra lớp không gian tên tham số với một triển khai cụ thể cung cấp tất cả các chi tiết cụ thể.
Đây là một ví dụ tầm thường:
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);
}
}
Được sử dụng như thế này:
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 {}
}
Tiêu thụ các dẫn xuất như thế này:
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);
}
}
Lợi ích của việc viết các kiểu theo cách này là thêm an toàn kiểu và ít hơn các kiểu trong các lớp trừu tượng. Nó tương đương ArrayList
với vs List<T>
trên quy mô lớn hơn.