泛型类






2.76/5 (10投票s)
Microsoft .NET 泛型类。
引言
对于大多数使用 .NET 的开发者来说,泛型是一个熟悉的概念。但是,泛型类的概念有时会在大多数应用程序设计中溜走。泛型列表是 .NET 中的一个关键特性,开发者倾向于在几乎每个自定义集合中使用它。但是,为什么不也使用泛型类呢?以下各节将让您全面了解泛型类,并且很可能,它将帮助您在必要时增加应用程序中泛型类的使用。
创建泛型类
我们将创建一个泛型类来保存 Number
值。该类稍后可以扩展为保存任何类型的数字,例如,int
、decimal
或 double
。因此,T
可以是任何类型的数字。
public class Number<T> {
public void AddToCollection(T value) {
}
}
然后,您可以将该类扩展到其他类型的数字,例如 int
或 double
,如下例所示
public class DecimalNumber : Number<double> {
public DecimalNumber() {
}
}
优点是它会为您提供确切的对象类型,从而消除类型转换。
具有多个泛型类型的泛型类
您甚至可以创建一个具有多个泛型类型的类。当您想要在单个基类中创建泛型类型的集合时,这将对您有利。
具有泛型属性的泛型类
您可以使用 where
和 new
关键字创建具有泛型属性的泛型类。以下示例是一个从 DataModelBase
类和 ILogicBase
接口继承/实现的类。通过使用 where
子句,我们可以指定需要作为属性类型的类型 (T
)。如果未为 T
提供特定类型,则 new
关键字默认创建 DataModelBase
类的实例。类型 T
必须从 DataModelBase
类继承。
public class LogicBase<T> : ILogicBase
where T : DataModelBase, new() {
private T _Model = default(T);
public T Data {
get {
if (_Model == null) {
_Model = new T();
}
return _Model;
}
set { _Model = value; }
}
}
因此,对于上述代码的实现,首先,我们必须通过继承 DataModelBase
来创建一个 CustomerData
类,并通过继承 LogicBase
类来创建 CustomerLogic
,如下所示。
从以下代码块中可以看出,CustomerLogic
类具有一个 CustomerData
对象作为属性。通过使用以下模式,我们可以提高应用程序的可扩展性
现实世界中的泛型类
您可以通过使用泛型类来大幅提高应用程序设计的可扩展性,并使其易于维护。让我们看一下以下场景,看看我们如何使用泛型类来实现这一点。
将客户记录保存到数据库中:我们需要定义某些类才能在数据库中创建客户记录。因此,对于初始设计,我们将创建一个泛型 LogicBase
类,其中 T
类型是 ValidationBase
类。ValidatioBase
-- 此类负责所有与业务相关的验证。以下代码块将向您显示 LogicBase
和 ValidationBase
类的语法。
public class ValidationBase {
public virtual bool IsValidName(string name) {
return name.Length > 5;
}
}
public class LogicBase where T : ValidationBase, new() {
private T _Validations = default(T);
public T Validations {
get {
if (_Validations == null) {
_Validations = new T();
}
return _Validations;
}
set { _Validations = value; }
}
}
现在,我们将通过继承 LogicBase
类来创建一个 CustomerClass
,并使用其 IsValidName
方法来进行业务验证。
public class Customer : LogicBase<ValidationBase> {
public void SaveCustomer(string name) {
if (Validations.IsValidName(name)) {
//Save Customer
}
}
}
正如您在前面的代码块中看到的,我们使用了 ValidationBase
来验证名称。为了进行客户特定的验证,让我们创建一个从 ValidationBase
类继承的 CustomerValidation
类。
public class CustomerValidation : ValidationBase {
public override bool IsValidName(string name) {
return name.Length > 10 ;
}
public bool IsValidCustomer() {
//Write validation logic
return true;
}
}
您可以使用 CustomerValidation
类仅编写客户特定的验证。修改 Customer
类以使用 CustomerValidation
类,如下所示
在这里,您将获得所有客户验证方法,而无需强制转换为 CustomerValidation
类型。
结论
通过使用泛型类,您可以显着提高应用程序设计和可扩展性。但是,在扩展到泛型类之前,必须彻底分析这些类。这将消除类结构中不必要的复杂性。可以使用某些设计模式来实现相同的行为,但它需要类型转换或反射。因此,通过使用泛型类,您可以消除在一定程度上进行类型转换的麻烦。