你不能这样做,而且有充分的理由。这并非特定于温莎城堡。问题是您无法保证这些方法被标记为virtual
,因此您会遇到不一致的情况,即有些状态来自包装对象,而有些状态来自代理对象。
想想下面这个非常简单的例子:
abstract class AbstractPerson {
public int Age { get; protected set; }
public abstract void Birthday();
}
class Person : AbstractPerson {
public Person(int age) { Age = age; }
public override Birthday() { Age++; }
}
假设我们要为AbstractPerson
拦截创建一个代理Birthday
。
class PersonProxy : AbstractPerson {
readonly AbstractPerson wrappedPerson;
public PersonProxy(AbstractPerson person) {
wrappedPerson = person;
}
public override void Birthday() {
DoInterceptors();
wrappedPerson.Birthday();
}
public void DoInterceptors() {
// do interceptors
}
}
请注意,我们无法覆盖Age
,因为它没有标记为virtual
. 这就是令人讨厌的状态不一致的来源:
Person knuth = new Person(71);
PersonProxy proxy = new PersonProxy(knuth);
Console.WriteLine(knuth.Age);
knuth.Birthday();
Console.WriteLine(knuth.Age);
Console.WriteLine(proxy.Age);
这将打印
71
72
0
到控制台。发生了什么?因为Age
没有被标记为虚拟,所以我们的代理对象不能覆盖基本行为并调用wrappedPerson.Age
. 此示例甚至表明添加Age = wrappedPerson.Age
到构造函数 forPersonProxy
将无济于事。我们的代理并不是真正的代理。这就是您不能包装现有对象的原因。