Переопределить свойство, определенное в базовом классе - PullRequest
15 голосов
/ 21 февраля 2012

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

   +---------------+
   | 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.

Ответы [ 2 ]

14 голосов
/ 21 февраля 2012

Простите, если я неверно истолковал это, но сработал бы следующий код:

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 (хотя это, вероятно, довольно плохой способ сделать это), скрывая его ширину.свойство:

public class MyUserControl : UserControl
{
    public new double Width
    {
        get
        {
            return base.Width;
        }
        set
        {
             if(!(value > 100 && value < 200))
                 base.Width = value;
        }
    }
}
0 голосов
/ 21 февраля 2012

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

public new int Age()
{
    get
    {
        return Age ?? 21;
    }
    set
    {
        Age = value;
    }
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...