首页 > 解决方案 > 我们如何将当前属性分配为等于新参数,然后在新值被关联时将其删除?

问题描述

测试应该检查火车何时被分配到他失去前一条线路的线路。Train 类应按照以下步骤在函数 public void AssignTo(ILine l) 中实现此测试(需要遵守它们):

  1. 当前任务= l1
  2. l1.Trains包含THIS
  3. 需要THISl1.trains
  4. 需要更改当前线路并将火车添加到新线路

    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);
        }

标签: c#classinheritancepropertiesenumerable

解决方案


您当前接口的问题在于ILine.TrainsIEnumerable您无法真正从IEnumerable. 在您的代码中,您假设它始终是 a List,您不应该这样做,但是如果您不能更改类型,ILine.Trains那么我想这是唯一的方法。

无论如何,您的代码不起作用的原因是您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;

推荐阅读