我们如何分配当前 属性 等于新参数,然后在分配新值时将其删除?
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) 中执行此测试,方法是遵循以下步骤(需要遵守它们):
- 当前分配
= l1
l1.Trains
包含 THIS
- 需要从
l1.trains
中删除 THIS
- 需要更改当前线路并将列车添加到新线路
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;
测试应该检查火车何时被分配到他丢失了前一行的线路。 class 火车应该在函数 public void AssignTo(ILine l) 中执行此测试,方法是遵循以下步骤(需要遵守它们):
- 当前分配
= l1
l1.Trains
包含THIS
- 需要从
l1.trains
中删除 - 需要更改当前线路并将列车添加到新线路
THIS
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;