将接口实现拉入基类

时间:2010-09-18 12:47:24

标签: c# refactoring interface

我正在使用一个库,它需要我的视图来实现一个接口,它只是一个依赖属性,并为它获取\ set访问器。唯一的区别是DP寄存器方法中的OwnerType。 AFAIK,重复代码很糟糕,我忘记在粘贴几次后改变OwnerType :)所以我想我应该尝试将其移动到基类中,并让它确定类型。经过一些搞乱之后,我通过在构造函数中初始化它,使用GetType()来确定类型。唯一的问题是当视图被破坏时,以后会重新创建,这会导致DP已经注册的ArgumentException。

  1. 重构是一个好主意吗?
  2. 我做得对吗? :)
  3. 如果1和2为真,我该如何检查DP是否已经注册?
  4. @Carl: 我不确定依赖属性是否未注册。我甚至不确定依赖属性是否可以取消注册:)

    这是原始类,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),并将作业放回到字段中。

1 个答案:

答案 0 :(得分:1)

这对我来说听起来像是一个很好的重构,尽管在每个类中都有一个简单的方法,而在超类中有一个稍微复杂的方法。

我不明白为什么在执行重构时行为发生了变化。无论什么机制在其实例被销毁时取消注册一个类应该继续工作;如果没有,那么探究原因。

是什么取消注册机制?你可以在调试器中单步执行它,直接实现接口的类吗?在你的重构下,图书馆可能会出现一些反思;如果是这样,最简单的事情可能是将错误报告给库作者并恢复到重复代码方法,直到它被修复。关于在粘贴后忘记更改OwnerType,也许你可以从一个片段中粘贴它,其中所有者类型被注释掉,或者为空或者不可编译,以迫使你快速修复它。