【问题标题】:Pulling Up Interface Implementation into base class将接口实现拉入基类
【发布时间】:2010-09-18 12:47:23
【问题描述】:

我正在使用一个库,它需要我的视图来实现一个接口,该接口只是一个依赖属性和它的 get\set 访问器。唯一的区别是 DP 的 Register 方法中的 OwnerType。 AFAIK,重复代码很糟糕,我现在粘贴几次后忘记更改 OwnerType :) 所以我想我应该尝试将它移到基类中,并让它确定类型。经过一番折腾,我通过在构造函数中初始化它,使用 GetType() 来确定类型,让它开始工作。唯一的问题是当视图被销毁并在稍后重新创建时,这会导致 DP 已注册的 ArgumentException。

  1. 这种重构是个好主意吗?
  2. 我做得对吗? :)
  3. 如果 1 和 2 为真,如何检查 DP 是否已注册?

@卡尔: 我不确定依赖属性是否曾经被取消注册。我什至不确定依赖属性是否可以取消注册:)

这是原始类,xaml 视图的代码隐藏(这个及其基类是我的创作):

[ViewnameToViewLookupKeyMetadata("StartView", typeof (StartView))]
public partial class StartView : IWorkSpaceAware
{
   public EditorStartView()
   {
       InitializeComponent();
   }


   public static readonly DependencyProperty WorkSpaceContextualDataProperty =
       DependencyProperty.Register("WorkSpaceContextualData", typeof(object), typeof(StartView),
                                   new FrameworkPropertyMetadata((WorkspaceData)null));

   public WorkspaceData WorkSpaceContextualData
   {
       get { return (WorkspaceData) GetValue(WorkSpaceContextualDataProperty); }
       set { SetValue(WorkSpaceContextualDataProperty, value); }
   }
}

元数据属性只是将查找字符串与类型相关联。

我认为它可以工作,因为注册只完成一次,即第一次创建视图时。

在基类中,Register 似乎必须在构造函数中,因此我可以使用 GetType() 作为 OwnerType。因此,当再次创建视图时,它会尝试再次注册,从而导致 ArgumentException。

界面简洁:

public interface IWorkSpaceAware
{
    WorkspaceData WorkSpaceContextualData { get; set; }
}

找到解决方案:

我将 Register OwnerType 更改为 typeof(MyViewBase),并将分配放回字段中。

【问题讨论】:

    标签: c# refactoring interface


    【解决方案1】:

    这听起来像是一个很好的重构,尽管在每个类中都有一个非常简单的方法与在超类中具有一个稍微复杂的方法之间存在权衡。

    我不明白为什么在您执行重构时行为会发生变化。无论何时在实例被销毁时取消注册类的任何机制都应该继续工作;如果没有,请探索为什么不。

    什么是注销机制?对于直接实现接口的类,您可以在调试器中单步执行吗?库中可能会进行一些反思,但在您的重构下会失败;如果是这样,最简单的方法可能是将错误报告给库作者并恢复到重复代码方法,直到它被修复。关于粘贴后忘记更改 OwnerType 的问题,也许您可​​以从 sn-p 中粘贴,将 OwnerType 注释掉,或者为空,或者无法编译,以强制您快速修复它。

    【讨论】:

      猜你喜欢
      • 2016-07-22
      • 2013-09-30
      • 2021-01-02
      • 1970-01-01
      • 2014-06-17
      • 2020-03-13
      • 2015-01-27
      • 2023-03-12
      相关资源
      最近更新 更多