我们如何分配当前 属性 等于新参数,然后在分配新值时将其删除?

How do we assign a current property to be equal to new parameter and then remove it when a new value is assined?

测试应该检查火车何时被分配到他丢失了前一行的线路。 class 火车应该在函数 public void AssignTo(ILine l) 中执行此测试,方法是遵循以下步骤(需要遵守它们):

  1. 当前分配= l1
  2. l1.Trains 包含 THIS
  3. 需要从 l1.trains
  4. 中删除 THIS
  5. 需要更改当前线路并将列车添加到新线路

    internal class Train : ITrain
    {
        internal Train(string name, Company company)
        {
            this.Name = name;
            this.Company = company;
        }

        public string Name
        {
            get;
        }

        public ICompany Company
        {
            get;
        }

        public ILine Assignment
        {
            get;
            private set;
        }

        public void AssignTo(ILine l)
        {
            //Current assignment = l1
            var l1 = Assignment;

            //l1,Trains contains THIS
            this.AssignTo(l1.train)

            //need to remove THIS from l1.trains
            ((List<Train>)l1.Trains).Remove(this);

            //need to change current line and add train to new line
            ((List<Train>)l.Trains).Add(this);
            Assignment = l;
           
        }
    }
}

[Test]
        public void T2_when_a_train_is_assigned_to_a_line_he_losts_its_previous_line()
        {
            ICity s = CityFactory.CreateCity("Paris");
            ICompany c = s.AddCompany("SNCF");
            ILine l1 = s.AddLine("RER A");
            ILine l2 = s.AddLine("RER B");
            ITrain t1 = c.AddTrain("RER1");

            t1.AssignTo(l1);
            t1.Assignment.Should().BeSameAs(l1);

            t1.AssignTo(l2);
            t1.Assignment.Should().BeSameAs(l2);
            l1.Trains.Count().Should().Be(0);
            l2.Trains.Single().Should().BeSameAs(t1);
        }

您当前界面的问题是 ILine.Trains 是一个 IEnumerable,您无法真正从 IEnumerable 中删除某些内容。在您的代码中,您假设它始终是 List,您不应该 真的 这样做,但是如果您不能更改 [=12] 的类型=] 那么我想这是唯一的方法。

无论如何,您的代码不起作用的原因是您出于某种原因递归调用 AssignTo。您应该删除此调用:

public void AssignTo(ILine l)
{
    var l1 = Assignment;

    // remove this line
    // this.AssignTo(l1.train)

    ((List<Train>)l1.Trains).Remove(this);

    ((List<Train>)l.Trains).Add(this);
    Assignment = l;

}

虽然这不是必需的,(这似乎是你的要求之一),但你需要先检查 l1.Trains 是否包含 this:

var l1 = Assignment;

if (l1.Trains.Contains(this)) {
    ((List<Train>)l1.Trains).Remove(this);
}

((List<Train>)l.Trains).Add(this);
Assignment = l;