Подтвердить что ты не робот

Переопределить свойство, определенное в базовом классе

У меня есть случай, когда иерархия классов выглядит примерно так:

   +---------------+
   | UIElement     |
   |---------------|                            +----------------------+
   | ...           |                            | My Windows Application
   | SomePropert{} |                            |----------------------|
   |               |<---+                       |+--------------------+|
   |               |    |                       ||MyUserControl       ||
   +---------------+    |                       ||--------------------||
         +--------------+-----+                 ||                    ||
         |FrameWorkElement    |                 |+--------------------+|
         |--------------------|                 |//Want to use         |
         |    ...             |<-+              |// SomeProperty;      |
         +--------------------+  |              |                      |
                     +-----------+-+            |                      |
                     |Control      |            |                      |
                     |-------------|            +----------------------+
                     |  ...        |<---+
                     +-------------+    |
                            +-----------+---+
                            | UserControl   |
                            |---------------|<---+
                            |  ...          |    |
                            +---------------+    |
                                      +----------+-------+
                                      | MyUserControl    |
                                      |------------------|
                                      | SomeProperty{}   |
                                      | //Want to override
                                      |                  |
                                      +------------------+

Теперь в моем приложении (и во всех других приложениях, где я могу экспортировать этот MyUserControl), я могу установить SomeProperty, который обрабатывается классом MyUserControl, а не UIElement?

Я сейчас делаю это, создавая объект для MyUserControl и назначая его элементу управления, который я добавил на моей странице xaml. Итак, сейчас выглядит так:

MyUserControl newControl = new MyUserControl();
web = windowsPhoneControl11;  //windowsPhoneControll1 is the 
                              //one that I added from toolbox.
                              // i.e., mycustomecontrol added from toolbox.

Итак, теперь, когда я использую "новое", он становится лишним. Но когда я экспортирую этот элемент управления, я не могу ожидать, что пользователь создаст новый объект и назначит его элементу управления, который он использует на странице xaml.

Итак, есть ли другой способ переопределить это свойство, чтобы присвоение этого свойства обрабатывалось классом MyUserControl, а не классом UIElement? Что я имею в виду о MyUserControl, имеющем элемент управления для установки этого свойства, так это то, что перед его назначением мне нужно проверить значение. Если он не является наименьшим ожидаемым значением, тогда мне нужно установить его по умолчанию.

Ps: Я сожалею о таком длинном вопросе, но я не мог выразить его более точно, и мне не удалось найти другой вопрос, связанный с этим. И это WindowsPhoneApp... Не обычное приложение windows.

4b9b3361

Ответ 1

Простите меня, если я интерпретирую это неправильно, но буду работать:

public class BaseClass
{
    public int MyProperty
    {
       get; set;
    }
}
public class ChildClass : BaseClass
{
    public new int MyProperty
    {
       get
       {
           return base.MyProperty;
       }
       set
       {
           if(DoYourCheckingStuff(value))
           {
               base.MyProperty = value;
           }
       }
    }
}

Не тестировал это.

Хотя это похоже на действительно хакерский способ сделать это. Какую собственность вы пытаетесь "контролировать"? Поскольку могут быть более простые способы сделать это.

Пример. Измените UserControl так, чтобы его ширина не могла быть установлена ​​между 100 и 200 (хотя это, вероятно, довольно плохой способ сделать это), спрятав свойство Width:

public class MyUserControl : UserControl
{
    public new double Width
    {
        get
        {
            return base.Width;
        }
        set
        {
             if(!(value > 100 && value < 200))
                 base.Width = value;
        }
    }
}

Ответ 2

вы можете переопределить свойства так же, как методы.

public new int Age()
{
    get
    {
        return Age ?? 21;
    }
    set
    {
        Age = value;
    }
}