Подтягивание реализации интерфейса в базовый класс - PullRequest
0 голосов
/ 18 сентября 2010

Я использую библиотеку, которой требуются мои представления для реализации интерфейса, который является только свойством зависимости и для него используется метод доступа get \ set.Единственное отличие - это OwnerType в методе регистрации DP.AFAIK, дублированный код - это плохо, и я забыл изменить OwnerType после нескольких вставок сейчас :) Так что я решил попробовать перенести это в базовый класс, чтобы он определил тип.После некоторого возни, я заставил его работать, инициализировав его в конструкторе с помощью GetType () для определения типа.Единственная проблема заключается в том, что представление уничтожается и создается заново позже, что вызывает ArgumentException, что DP уже зарегистрирован.

  1. Является ли этот рефакторинг хорошей идеей?
  2. Я делаюэто правильно?:)
  3. Если 1 и 2 истинны, как я могу проверить, зарегистрирован ли DP уже?

@ 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; }
}

Найдено решение:

Я изменилЗарегистрируйте OwnerType для typeof (MyViewBase) и поместите назначение обратно в поле.

1 Ответ

1 голос
/ 18 сентября 2010

Для меня это звучит как хороший рефакторинг, хотя есть компромисс между наличием тривиально простого метода в каждом классе и немного более сложного метода в суперклассе.

Что я не понимаю, так это то, почему поведение изменилось, когда вы выполнили рефакторинг. Какой бы механизм не был изначально создан для отмены регистрации класса, когда его экземпляр уничтожен, должен продолжать работать; если нет, то выясните, почему нет.

Что является механизмом отмены регистрации? Можете ли вы пройти через это в отладчике для класса, который непосредственно реализует интерфейс? В библиотеке может произойти какое-то размышление, которое не сработает при вашем рефакторинге; если это так, самое простое - сообщить об ошибке автору библиотеки и вернуться к подходу с дублированным кодом, пока он не будет исправлен. Что касается того, чтобы забыть изменить OwnerType после его вставки, возможно, вы могли бы вставить его из фрагмента с закомментированным OwnerType, либо пустым, либо иным образом некомпилируемым, чтобы заставить вас быстро его исправить.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...