我需要在运行时更改接口的实现。许多类都引用此接口。
这是我的测试用例,它没有按我预期的那样工作。(更改接口的引用似乎并没有在使用它的所有地方都进行更新)
这是示例:
// 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)
将不是解决方案。
由于您已经实现了一个外观,为什么不实现第二个外观:
class ChangableDiet : IDiet
{
private IDiet _diet;
public ChangableDiet (IDiet diet)
{
_diet = diet;
}
public Diet Diet { get { return _diet;} set { _diet = value; } }
public void Eat()
{
_diet.Eat();
}
}
建设这些中的一个,并通过它的Human
构造函数。
void Main()
{
IDiet diet = new CarnivoreDiet();
var changable = new ChangableDiet(diet)
Human human = new Human(changable );
human.Eat();
// outputs "Eat chicken"
changable.Diet = new HerbivoreDiet();
human.Eat();
// outputs "Eat spinach"
}
本文收集自互联网,转载请注明来源。
如有侵权,请联系[email protected] 删除。
我来说两句