65.9K
CodeProject 正在变化。 阅读更多。
Home

泛型类

starIconstarIcon
emptyStarIcon
starIcon
emptyStarIconemptyStarIcon

2.76/5 (10投票s)

2010年1月18日

CPOL

3分钟阅读

viewsIcon

36893

Microsoft .NET 泛型类。

引言

对于大多数使用 .NET 的开发者来说,泛型是一个熟悉的概念。但是,泛型类的概念有时会在大多数应用程序设计中溜走。泛型列表是 .NET 中的一个关键特性,开发者倾向于在几乎每个自定义集合中使用它。但是,为什么不也使用泛型类呢?以下各节将让您全面了解泛型类,并且很可能,它将帮助您在必要时增加应用程序中泛型类的使用。

创建泛型类

我们将创建一个泛型类来保存 Number 值。该类稍后可以扩展为保存任何类型的数字,例如,intdecimaldouble。因此,T 可以是任何类型的数字。

public class Number<T> {
    public void AddToCollection(T value) {
    }
}

然后,您可以将该类扩展到其他类型的数字,例如 intdouble,如下例所示

public class DecimalNumber : Number<double> {
    public DecimalNumber() {
    }
}

优点是它会为您提供确切的对象类型,从而消除类型转换。

具有多个泛型类型的泛型类

您甚至可以创建一个具有多个泛型类型的类。当您想要在单个基类中创建泛型类型的集合时,这将对您有利。

具有泛型属性的泛型类

您可以使用 wherenew 关键字创建具有泛型属性的泛型类。以下示例是一个从 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 -- 此类负责所有与业务相关的验证。以下代码块将向您显示 LogicBaseValidationBase 类的语法。

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 类型。

结论

通过使用泛型类,您可以显着提高应用程序设计和可扩展性。但是,在扩展到泛型类之前,必须彻底分析这些类。这将消除类结构中不必要的复杂性。可以使用某些设计模式来实现相同的行为,但它需要类型转换或反射。因此,通过使用泛型类,您可以消除在一定程度上进行类型转换的麻烦。

© . All rights reserved.