gpt4 book ai didi

c# - 接口(interface)不通过引用传递

转载 作者:行者123 更新时间:2023-11-30 19:15:57 26 4
gpt4 key购买 nike

我需要在运行时更改接口(interface)的实现。这个接口(interface)被很多类引用。

这是我的测试用例,它没有像我预期的那样工作。 (更改接口(interface)的引用似乎并没有在所有使用它的地方更新)

例子如下:

// 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 接口(interface)在 Human 实例中没有更新?

PS:IDiet 接口(interface)在许多类中使用,因此添加像 SetDiet(IDiet diet) 这样的方法将不是解决方案。

最佳答案

当您通过此代码传递对象引用时:

Human human = new Human(diet);

引用(对象的地址)被复制到它的参数:

public Human(IDiet diet)
{
_diet = diet;
}

它们是 3 个不同的内存块,包含对对象的相同引用:您的原始 diet、参数变量 (diet) 和你的类属性 (_diet)。

所以当你执行你的代码时:

diet = new HerbivoreDiet();

这个内存块现在包含对新对象 (HerbivoreDiet) 的引用,但是 Human 中的那个仍然引用旧对象。

关于c# - 接口(interface)不通过引用传递,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/30397648/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com