为什么客户项目需要同时参考基础项目和中间项目
本文关键字:项目 参考 中间 客户 为什么 | 更新日期: 2023-09-27 18:01:11
我有三个项目:基础项目、中间项目和客户端项目。客户端通过中间项目访问基础项目。我在这里简化了我的问题。我有3个项目的解决方案:
// Animals project
public class FarmAnimal
{
public string GetFood { get; protected set; }
}
public class Cow : FarmAnimal
{
public Cow()
{
GetFood = "Milk";
}
}
public class Chicken : FarmAnimal
{
public Chicken()
{
GetFood = "Egg";
}
}
// Farmer project
public class AbstractFarmer<TAnimal> where TAnimal : FarmAnimal, new()
{
protected TAnimal animal = new TAnimal();
public string GetProduct()
{
return animal.GetFood;
}
}
public class CowFarmer: AbstractFarmer<Cow>
{
}
public class ChickenFarmer : AbstractFarmer<Chicken>
{
}
// Client project
class Program
{
static void Main(string[] args)
{
var cowFarmer = new CowFarmer();
Console.WriteLine(cowFarmer.GetProduct());
}
}
如果客户项目没有添加对动物的引用,那么它会给出:
错误1在未引用的程序集中定义了类型"Animals.FarmAnimal"。必须添加对程序集"Animals,Version=1.0.0.0,Culture=neutral,PublicKeyToken=null"的引用。
封装的原则是,客户不应该知道"动物",只应该知道中间物("农民"(。
我该如何解决这个问题?为什么会出现这个问题?
将农民项目更改为
public class AbstractFarmer
{
protected FarmAnimal animal;
public string GetProduct()
{
return animal.GetFood;
}
}
public class CowFarmer : AbstractFarmer
{
public CowFarmer()
{
animal = new Cow();
}
}
public class ChickenFarmer : AbstractFarmer
{
public ChickenFarmer()
{
animal = new Chicken();
}
}
它应该可以正常工作。
实际情况是,当您将动态<Type>
显式提供给AbstractFarmer
类时,您必须将Farmer实现与抛出错误的Animal required类型参数绑定。
说明:
来自MSDN文档,
类型参数是客户端指定类型的占位符指定它们实例化泛型类型的变量的时间
这意味着类中任何需要泛型类型参数的实例变量在实例化时都必须传递其所需的类型。
在您的情况下,您不需要在实例化期间传递类型
var cowFarmer = new CowFarmer();
因为您已将Type参数与类一起指定。(如果您双击错误,假设您使用的是Visual Studio,它甚至会将您指向上面的行。(
public class CowFarmer: AbstractFarmer<Cow>
然而,在实例化时, 我认为,这就是您混淆的原因——Cow
类现在需要与cowFarmer
变量绑定(该变量存在于客户端程序集中(,并且该变量要完全实例化将需要引用其中包含Cow
类的动物程序集Type
Cow
,在cowFarmer
实例化时不直接可见。