看到了吗?标记问题。

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/

10-13 06:52