首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >是否使用泛型?

是否使用泛型?
EN

Stack Overflow用户
提问于 2011-11-17 12:46:53
回答 3查看 1.5K关注 0票数 4

我有一个关于是否使用泛型的简单问题,如果是,这是正确的方式吗?

正常的非通用版本如下:

代码语言:javascript
复制
    public interface IFood
{
    string name { get; set; }
}

public class Vegetables : IFood
{
    #region IFood Members

    public string name
    {
        get { return "Cabbage"; }
        set{ }
    }

    #endregion
}

public class Cow
{
    private IFood _food;

    public Cow(IFood food)
    {
        _food = food;
    }

    public string Eat()
    {
        return "I am eating " + _food.name;
    }
}

通用版本如下:

代码语言:javascript
复制
    public class Cow<T> where T : IFood
{
    private T _food;
    public Cow(T food)
    {
        _food = food
    }

    public string Eat()
    {
        return "I am eating " + _food.name;
    }
}

我在泛型版本中做的一切都是正确的吗?为了未来的发展,是否有必要使用通用版本?这只是原始场景的简单模型,但它与原始场景完全相似。

EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2011-11-17 12:57:48

我认为在这个具体的例子中这是一个坏主意。

List<int>通常被描述为int的列表。Cow<IFood>更难描述--它肯定不是IFood的母牛。这不是一个扣篮的论点,但显示了一个潜在的问题。

MSDN声明:

使用泛型类型来最大化代码重用、类型安全和性能。

在您的示例中,泛型版本没有更多的代码重用,没有更多的类型安全,也没有改进的性能。

票数 11
EN

Stack Overflow用户

发布于 2011-11-17 12:53:15

我认为使用泛型来强制执行行为规则是一个非常非常糟糕的想法。如果您只希望一头牛能够吃蔬菜,那么这就更符合逻辑,应该通过逻辑规则来强制执行,而不是试图让编译器强制执行它。因此,牛应该接受所有的食物,然后应用程序逻辑决定如果您给它提供了除了它可以吃的东西之外的东西该做什么。

一个很好的例子是,如果您决定将Hay添加为奶牛可以吃的东西,则无法使用泛型来说明您可以给奶牛蔬菜或Hay,除非您创建了一个IVegetableOrHay接口,这应该会让我们都想杀了那头牛,然后把它当做晚餐吃。

编译器类型强制是为了确保正确的程序结构。应用程序逻辑属于代码。

票数 4
EN

Stack Overflow用户

发布于 2011-11-17 12:59:42

您想使用泛型扩展/实现子类功能吗?那么这就不是泛型的目的。您将使用generic,其中所有类型的对象都有相同的目的来满足。比如序列化。在这里,如果您使COW泛型,那么您必须在COW中实现COW特性的子类。这将不会拒绝另一个子类的遗赠。在这里,COW可以是超类而不是泛型。我的建议是对不同的类族使用泛型。不在同一类的家族中。

票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/8162247

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档