2011-11-17 43 views
4

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

正常的非泛型版本如下:

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; 
    } 
} 

通用版本如下:

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; 
    } 
} 

我是对的通用版本所做的一切?是否有必要使用通用版本进行未来发展?这只是原始场景的简单模拟,但它完全类似。

+6

你需要一个奶牛类是完全独立于奶牛?或者,一个给定的牛可以喂食谷物,玉米或其他任何通过动物饲料喂食的绒毛吗?通用版本中的奶牛不是同一个东西,只不过是一个列表与列表相同。另一方面,对我来说,牛是牛。 –

+0

@AnthonyPegram:这应该是一个答案 – Dani

+0

@AnthonyPegram因此,你不建议只使用通用版本,因为奶牛不同于奶牛。你能解释一个适当的例子,并在答案部分,因为我想将它标记为答案,但不在评论部分 – DotNetInfo

回答

10

我觉得在这个具体的例子中它是一个坏主意。

A List<int>通常被描述为int列表。 A Cow<IFood>很难形容 - 它当然不是IFood的母牛。这不是一个扣篮扣篮的说法,但显示了一个潜在的问题。

MSDN状态:

使用泛型类型最大化代码重用,类型安全,并 性能。

在你的例子中,通用版本没有更多的代码重用,没有更多的类型安全性和没有改进的性能。

3

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

一个很好的例子就是如果你决定把Hay添加为奶牛可以吃的东西,那么就没有办法使用泛型来说你可以给奶牛提供蔬菜或干草,除非你创建了一个IVegetableOrHay接口,这应该使我们都想要杀死那头牛并且吃它吃晚饭。

编译器类型执行用于确保正确的程序结构。应用程序逻辑属于代码。

1

你想使用泛型扩展/实现子类特性吗?那么这不是通用的目的。您将在所有类型的对象具有相同目的的情况下使用泛型。像序列化一样。在这里,如果您使COW通用,那么您必须在COW内部实现COW功能的子类。这不会拒绝另一个子类的遗赠。这里的COW可以是超类,而不是通用的。我的建议是使用通用的不同系列的类。不在相同的班级中。