Как добавить функциональность в унаследованное свойство? - PullRequest
0 голосов
/ 01 августа 2011

Я следую инструкциям в этом посте: как создать многопользовательский элемент управления, указывающий один код за файлом в silverlight 4

Это пример из моего кода.

public class MyCommonUserControl : UserControl
{
    public static DependencyProperty CustomProperty = DependencyProperty.Register(
        "CustomProperty", typeof(int), typeof(MyCommonUserControl));

     public int CustomProperty
     {
         get
         {  
             return (int)GetValue(TypeProperty);
         }
         set
         {
             SetValue(TypeProperty, value);
             Extension();
         }
     }

     public virtual void Extension()
     {
     }
}

public class FirstMyCommonUserControl : MyCommonUserControl 
{
     public FirstMyCommonUserControl()
     {
         InitializeComponent();
     }

     public override void Extension()
     {
         base.Extension();

         // Do something
     }
}

Как вы можете видеть выше, я использую наследование.Этот код работает для меня, потому что у меня есть несколько пользовательских элементов управления, одним из которых является класс FirstMyCommonUserControl, который переопределяет виртуальный метод, и я могу добавить некоторые вещи для этого конкретного класса.Затем я делаю это:

    MyCommonUserControl A;
    int number;

    private void button1_Click(object sender, RoutedEventArgs e)
    {            
        switch (number)
        {
            case 1:
            case 2:
            case 3:
            case 4:
                A = new FirstMyCommonUserControl();
                A.CustomProperty = number;

                canvas1.Children.Add((FirstMyCommonUserControl)A);
                break;
            case 5:
            case 6:
            case 7:
            case 8:
                A = new AnotherMyCommonUserControl();
                A.CustomProperty = number;

                canvas1.Children.Add((AnotherMyCommonUserControl)A);
                break;
        }
    }

Каждый конкретный класс должен сделать что-то большее в CustomProperty.Я сделал это с помощью виртуальных методов и переопределил его.Я не знаю, если это лучший способ.

1 Ответ

1 голос
/ 01 августа 2011

Свойства также могут быть виртуальными, а не только методами.Таким образом, вы могли бы написать что-то вроде

public class MyCommonUserControl : UserControl
{     
    public virtual int CustomProperty     
    {         
        get { return (int)GetValue(TypeProperty); }
        set { SetValue(TypeProperty, value); }
    }
}

public class FirstMyCommonUserControl : MyCommonUserControl 
{
    public override int CustomProperty     
    {         
        get 
        { 
            // Do something
            return base.CustomProperty;
        }
        set 
        { 
            // Do something
            base.CustomProperty = value;
        }
    }
}

Хотя вопрос о том, действительно ли это лучше , является дискуссионным.

Кроме того, нет необходимости в приведении этого выраженияВаш:

canvas1.Children.Add((FirstMyCommonUserControl)A);

Вы можете просто написать:

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