我正在尝试理解这条线:
private Queue<IProductable> inventory { get; set; }
它用于下面的整个代码中。我只习惯看到使用简单类型定义的属性;所以,这真让我困惑。另外,我很好奇为什么类Factory(下面)的构造函数使用:
inventory = new Queue<IProductable>();
而不是:
Queue<IProductable> inventory = new Queue<IProductable>();
我的理解是当你实例化一个新对象时,你应该这样做:CLASS/TYPE newObjectName = new CLASS/TYPE
。构造函数是否甚至实例化了一个新的“库存”对象?如果是这样,为什么我不必指定对象“inventory”的类型(为了使用它来调用通用Collections类Queue中的方法)。
无论如何,下面是代码。我希望有人可以用最简单的方式解释这一点,让我在将来需要做类似的事情时理解/记住。
namespace codeExample
{
class Factory
{
private Queue<IProductable> inventory { get; set; }
public Factory()
{
inventory = new Queue<IProductable>();
}
public IProductable GetOldestItem()
{
IProductable oldestItem = inventory.First();
return oldestItem;
}
public IProductable GetNewestItem()
{
IProductable newestItem = inventory.Last();
return newestItem;
}
public void Add(IProductable productToAdd)
{
inventory.Enqueue(productToAdd);
}
}
}
答案 0 :(得分:2)
我的理解是当你实例化一个新对象时,你应该这样做:CLASS / TYPE newObjectName = new CLASS / TYPE。构造函数是否甚至实例化了一个新的“库存”对象?
如果包含类型,那么它将创建一个新的局部变量。目前代码没有创建新变量,而是使用属性,这是该类的实例数据的一部分(至少在这种情况下)。该属性(在此特定上下文中)的行为几乎与私有字段完全相同。它创建的变量存在于整个对象的生命周期中,而不仅仅是一个方法。
构造函数是否甚至实例化了一个新的“库存”对象?
它正在创建一个新的队列对象,是的。属性定义定义可以存储队列的位置,但不会创建实际队列。构造函数实际上创建了一个队列(它是空的)并将其分配给变量。
答案 1 :(得分:0)
private Queue<IProductable> inventory { get; set; }
它相当于
private Queue<IProductable> _inventory;
public Queue<IProductable> Inventory
{
get { return _inventory; }
set { _inventory = value; }
}
因此,您刚刚声明了一个成员库存,稍后您实例化Queue<IProductable>
并将其引用存储到自动属性inventory
。
inventory = new Queue<IProductable>();
答案 2 :(得分:0)
我只习惯看到用简单类型定义的属性;所以这 真的很困惑我
为什么呢?您可以定义任何类型的属性。
另外,我很好奇为什么类Factory的构造函数(下面) 用途:
您无法再次定义属性的类型,它已在当前范围内可用,因为它是一个类属性。其类型在行private Queue<IProductable> inventory { get; set; }
我的理解是当你实例化一个新对象时,你应该这样做: CLASS / TYPE newObjectName = new CLASS / TYPE
不,这是一个简单的反例,有两行:
MyType myVariable;
...
myVariable = new MyType();
答案 3 :(得分:0)
private Queue<IProductable> inventory { get; set; }
声明auto-implemented property,但它也可能是field:
private Queue<IProductable> inventory;
这声明了一个private
instance variable,你可以从这个类中的任何方法访问它,但不能从派生类或类外部访问。
您的代码在构造函数中指定一个值,该值始终在类中的其他代码之前运行:
inventory = new Queue<IProductable>();
现在,在本课程的任何地方,您都可以访问inventory
。
答案 4 :(得分:0)
private Queue<IProductable> inventory { get; set; }
是一个自动属性。 get / set的实现由编译器提供。
VS
Queue<IProductable> inventory = new Queue<IProductable>();
现在,inventory
是一个字段。属性具有后备存储,并且比字段更智能。它们允许程序员在get / set操作期间完成工作。
构造函数是否甚至实例化了一个新的“库存”对象?
是的,在示例中,构造函数正在设置隐藏变量(后备存储)。
如果是这样,为什么我不必指定对象“库存”的类型 (为了使用它来调用通用集合中的方法 class,Queue)。
因为您没有在构造函数中声明新变量。我们设置属性。
在这里,您可以使用字段而不是属性。但是,我希望“高级类”/工厂使用依赖注入,因此在这种情况下公共属性是有意义的。 (也许你简化了原始代码?)