关于是否使用泛型有一个简单的问题,如果是,这是正确的方法吗?
正常的非通用版本如下:
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;
}
}
我是否在通用版本中做得很好?是否有必要使用通用版本进行未来增长?这只是原始场景的简单模拟,但它完全类似。
答案 0 :(得分:11)
我认为在这个具体的例子中这是一个坏主意。
List<int>
通常被描述为List of int。
Cow<IFood>
更难以形容 - 它当然不是一头牛。这不是一个扣篮争论,但显示了一个潜在的问题。
MSDN州:
使用泛型类型来最大化代码重用,键入安全性和 性能
在您的示例中,通用版本不再有代码重用,不再具有类型安全性,也没有改进的性能。
答案 1 :(得分:4)
我认为使用泛型来强制执行行为规则是一个非常糟糕的主意。如果你只想要一头母牛能吃蔬菜,那就更符合逻辑了,应该用逻辑规则强制执行,而不是试图让编译器强制执行它。因此,奶牛应该接受所有的食物,然后应用逻辑决定如果你给它吃的东西除了可以吃的东西之外该怎么做。
这方面的一个很好的例子是,如果你决定将Hay添加为奶牛可以吃的东西,除非你创建一个IVegetableOrHay界面,否则没有办法使用泛型来表示你可以给掉Cow或Hay。这应该让我们都想杀死那头牛并吃晚餐。
编译器类型实施是为了确保正确的程序结构。应用程序逻辑属于代码。
答案 2 :(得分:2)
您想使用泛型扩展/实现子类功能吗?那么这不是Generic的目的。您将使用通用,其中所有类型的对象具有相同的目的。像序列化一样。在这里,如果你使COW通用,那么你必须在COW中实现COW功能的子类。这不会拒绝另一个子类的遗赠。 COW可以是超级而不是通用的。我的建议是为不同的类家族使用泛型。不属于同一类别。