如何解决在 C# 的遗留代码中使用装饰器类的好做法是什么?
我使用装饰器模式装饰了以下遗留接口和类:
public interface ISetting : ICloneable
{
string Name;
// other properties and stuff
}
public class StringSetting : ISetting
{
public string Name {get; set;};
public string Value {get; set;}
// other properties and stuff
}
这里是两个对应的装饰器类
public abstract class SettingsDecorator : ISetting,INotifyPropertyChanged
{
private readonly ISetting setting;
public string Name => setting.Name;
}
public class StringSettingDecorator : SettingsDecorator
{
private StringSetting stringSetting;
public string Value // this is an example for the decoration: we added INotifyPropertyChanged
{
get
{
return stringSetting.Value;
}
set
{
stringSetting.Value = value;
InvokePropertyChanged("Value");
}
}
现在我有以下情况:我正在使用我的 StringSettingDecorator
类,在某些时候我必须将 ISetting
的集合提供给一些遗留代码,在那里它被转换为不同的类实例实现 ISetting
的类:
private void SomeLegacyCode(ISetting mySetting)
{
var stringSetting = mySetting as StringSetting;
if (stringSetting != null)
{
return;
}
// actual work done
}
显然这里 stringSetting
总是 null
,因为我给它的实例是 StringSettingDecorator
而不是 StringSetting
。据我所知 - 由于我无法更改遗留代码,因此无法更改装饰器模式 - 我有以下选项:
-
在我的装饰器类中有一些自定义转换功能,允许转换到原始类(请阅读,as
关键字不能被重载) - 在将对象发送到遗留代码之前准备对象,而无需更改装饰器类
- 向装饰器类添加一个功能,该类返回底层
StringSetting
实例并在将对象发送到旧代码之前以这种方式准备对象。
以下哪个是最佳选择……为什么?有没有更好的方法来处理这样的问题(我必须承认,这是第一次实现这种模式,所以我还不能 100% 确定我的实现)
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。