これを行うことはできません。これには正当な理由があります。これはウィンザー城に限ったことではありません。問題は、メソッドが としてマークされているという保証がない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
、コンストラクターに追加してPersonProxy
も役に立たないことを示しています。私たちのプロキシは実際にはプロキシではありません。これが、既存のオブジェクトをラップできない理由です。