看到了吗?标记问题。
public class Person
{
public Int16 ID { get; private set; }
public string Name { get; private set; }
public List<Toy> Toys { get; private set; }
public Person(Int16 id, string name, List<Toy> toys)
{ ID = id; Name = name; Toys = toys; }
}
public class Toy
{
public string Name { get; private set; }
public Person Owner { get; private set; }
public Toy(Person owner, string name)
{ Owner = owner; Name = name; }
}
问题出在Person CTOR。如何将玩具传递给Person ctor?玩具需要在“玩具容器”中拥有所有者,但尚未建立该所有者。
我知道我可以将Toys移出Person CTOR并将其公开。假设您只获得了与生俱来的玩具-私人玩具;有目的我了解我所要求的可能是不可能的。
就像任何人真正在乎的一样,但是Toy只需要知道它所有者的名字,所以我可以修改Toys。
public class Toy
{
private Person owner;
private string ownerName;
public string Name { get; private set; }
public String OwnerName
{
get
{
if (!string.IsnullOrEmpty(ownerName)) return ownerName;
elseif (owner != null) return owner.Name;
else throw new exception("homelesstoy");
}
public Toy( string name, Person owner)
{
Name = name; Owner = owner;
// new toy need to write it to DB
}
public Toy( string name, string _ownerName)
{
Name = name; ownerName = _ownerName;
}
}
以一种怪异的方式,这更好。如果我的玩具是我的车,而且他们有我的钥匙,我不要他们知道我的地址。警察可以从我的名字中找到我是否可以找到汽车。
最佳答案
为什么Owner
上的二传手是私有的?我可以理解您对Toys
类中Person
上的二传手的观点。
如果删除了该约束,则可以创建后备存储(完整属性),然后在Person
构造函数中循环玩具列表并执行item.Owner = this
。
public class Toy
{
private Person _owner = null;
public string Name { get; private set; }
public Person Owner {
get { return _owner; };
set {
if(_owner != null) throw new InvalidOperationException("No Stealing");
_owner = value;
}
}
public Toy(Person owner, string name)
{ Owner = owner; Name = name; }
}
这将允许您仅设置一次
Owner
,随后对setter的调用将是例外。您无需更改构造函数,因为您仍然可以这样做:Toy batman = new Toy(null, "Bruce");
我看到的一个问题是,这种“玩具所有者”关系并不能模拟现实世界。有时,儿童天生就有许多玩具可供使用,但是几乎没有直接拥有者生产玩具。即使在创建玩具并将其提供给某人之后,也可以将其提供给其他人。
我认为概念上的细节会在逻辑上使您绊倒。
编辑:
忘记了构造函数...
public Person(Int16 id, string name, List<Toy> toys)
{
id = ID;
Name = name;
foreach(Toy item in toys) {
item.Owner = this;
}
Toys = toys;
}
关于c# - 需要对类CTOR的对象的引用(在构建对象之前),我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/9805490/