【发布时间】:2015-05-22 13:11:57
【问题描述】:
我需要在运行时更改接口的实现。这个接口被很多类引用。
这是我的测试用例,它没有像我预期的那样工作。 (更改接口的引用似乎并没有在所有使用它的地方更新)
示例如下:
// interface to change at runtime
interface IDiet
{
void Eat();
}
class CarnivoreDiet : IDiet
{
public void Eat()
{
Debug.WriteLine("Eat chicken");
}
}
class HerbivoreDiet : IDiet
{
public void Eat()
{
Debug.WriteLine("Eat spinach");
}
}
class Human : IDiet
{
private readonly IDiet _diet;
public Human(IDiet diet)
{
_diet = diet;
}
public void Eat()
{
_diet.Eat();
}
}
void Main()
{
IDiet diet = new CarnivoreDiet();
Human human = new Human(diet);
human.Eat();
// outputs "Eat chicken"
diet = new HerbivoreDiet();
human.Eat();
// still outputs "Eat chicken" even if i changed the reference of IDiet interface
}
为什么IDiet 接口没有在Human 实例内部更新?
PS:IDiet 接口在很多类中都有使用,所以添加SetDiet(IDiet diet) 之类的方法不会解决问题。
【问题讨论】:
-
你期望什么,你观察到什么行为? “不更新”是什么意思?参考是只读的;设置后,引用应该是不可变的。
-
因为 Human 拥有参考的副本 (
_diet) 而您正在修改参考的另一个副本 (diet) -
@Rahul 这本质上是构造函数注入。我认为 IoC 或 DI 不会改变任何事情。
-
接口在这里无关紧要——我认为您从根本上需要重新审视 C# 的工作原理。特别是,您似乎希望
human._diet字段链接到diet局部变量。不是 -diet的值被复制到diet参数中,然后该参数被复制到_diet字段中。以后对diet局部变量的更改是无关紧要的。
标签: c# asp.net pointers reference