在保留对对象的引用的同时替换对象

本文关键字:对象 替换 引用 保留 | 更新日期: 2023-09-27 18:09:38

假设我有一个特定类型的活动对象。其他一些对象可能保留对它的引用。

现在我需要用它的后代(即它的一个更"特定"的克隆)"替换"这个对象,并且所有引用旧对象的对象都应该指向新对象。(考虑到新对象是旧对象的后代,裁判甚至不应该注意到差异;但这只是有效性的问题)。

从技术上讲,这可以通过创建新对象然后以某种方式更新引用来实现,或者通过动态更改现有对象的类型来实现,以便引用相同。(但后一种转换正在缩小,这带来了一些问题)。

是否有一个正常的。net方式来实现这一点?(VB或c#).

在保留对对象的引用的同时替换对象

你几乎是在重塑策略模式(或至少是其变体):

interface IBehavior
{
    int DoFoo();
}
class Proxy : IBehavior
{
    public IBehavior Strategy { get; set; }
    public int DoFoo()
    {
        return Strategy.DoFoo();
    }
}
class BasicBehavior : IBehavior { ... }
class AdvancedBehavior : IBehavior { ... }

现在,有了这些,你可以:

class Consumer
{
    public IBehavior Behavior { get; set; }
}
// Keep reference to behavior somewhere handy
var behavior = new Proxy { Behavior = new BasicBehavior() };
var myConsumer = new Consumer { Behavior = behavior };
// Now myConsumer is using Basic Behavior
behavior.Strategy = new AdvancedBehavior();
// ...and now myConsumer is using Advanced Behavior

我不知道一个简单的,内置的方法来做到这一点。我可以想到两个"变通办法"。

  1. 创建一个"包装器类",其中只包含稍后要替换的对象的属性。使所有引用都指向该包装器的实例,而不是对象本身。
  2. 创建单个元素集合(例如一个简单数组)。根据需要交换元素0并使引用指向数组。

示例1:

public class Wrapper
{
    public BaseClass TheObject { get; set; }
}
Wrapper reference1 = new Wrapper();
reference1.TheObject = new BaseObject();
Wrapper reference2 = reference1;
Wrapper reference3 = reference1;
reference2.TheObject = new DerivedFromBase();

示例2:

BaseObject[] reference1 = new BaseObject[1];
reference1[0] = new BaseObject();
var reference2 = reference1;
var reference3 = reference1;
reference3[0] = new DerivedFromBase();