C# 重写在基类中定义的属性

C# 重写在基类中定义的属性,c#,windows-phone-7,xaml,user-controls,C#,Windows Phone 7,Xaml,User Controls,我有一个例子,类的层次结构是这样的 +---------------+ | UIElement | |---------------| +----------------------+ | ... | | My Windows Application | SomePropert{} |

我有一个例子,类的层次结构是这样的

   +---------------+
   | UIElement     |
   |---------------|                            +----------------------+
   | ...           |                            | My Windows Application
   | SomePropert{} |                            |----------------------|
   |               |<---+                       |+--------------------+|
   |               |    |                       ||MyUserControl       ||
   +---------------+    |                       ||--------------------||
         +--------------+-----+                 ||                    ||
         |FrameWorkElement    |                 |+--------------------+|
         |--------------------|                 |//Want to use         |
         |    ...             |<-+              |// SomeProperty;      |
         +--------------------+  |              |                      |
                     +-----------+-+            |                      |
                     |Control      |            |                      |
                     |-------------|            +----------------------+
                     |  ...        |<---+
                     +-------------+    |
                            +-----------+---+
                            | UserControl   |
                            |---------------|<---+
                            |  ...          |    |
                            +---------------+    |
                                      +----------+-------+
                                      | MyUserControl    |
                                      |------------------|
                                      | SomeProperty{}   |
                                      | //Want to override
                                      |                  |
                                      +------------------+
MyUserControl newControl = new MyUserControl();
web = windowsPhoneControl11;  //windowsPhoneControll1 is the 
                              //one that I added from toolbox.
                              // i.e., mycustomecontrol added from toolbox.
所以现在因为我使用了“new”,它被覆盖了。但是当我导出这个控件时,我不能期望用户创建一个新对象并将其分配给在xaml页面中使用的控件

那么,有没有其他方法可以重写这个属性,以便该属性的赋值由MyUserControl类而不是UIElement类处理?MyUserControl拥有设置此属性的控件的意思是,在分配它之前,我需要检查一些值。如果它至少不是预期值,那么我需要将其设置为默认值


Ps:我很抱歉问了这么长的问题,但我无法表达得更准确,我也找不到任何其他与此相关的问题。这是WindowsPhoneApp。。。不是普通的Windows应用程序。

您可以像重写方法一样重写属性

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

如果我错误地解释了这一点,请原谅我,但我希望以下工作:

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的width属性来更改它,使其宽度不能设置在100到200之间(尽管这可能是一种非常糟糕的方法)

public class MyUserControl : UserControl
{
    public new double Width
    {
        get
        {
            return base.Width;
        }
        set
        {
             if(!(value > 100 && value < 200))
                 base.Width = value;
        }
    }
}
公共类MyUserControl:UserControl
{
公共新双宽度
{
得到
{
返回基。宽度;
}
设置
{
如果(!(值>100和值<200))
基础宽度=值;
}
}
}

MyUserControl newControl=newmyusercontrol()的含义是什么提供的代码中的这一行?ASCII图的一票:D如果基本属性未设置为“虚拟”,则除了新属性之外,您无法覆盖它(您提到的缺点)。但也许你可以用另一种方式达到你的目标。您试图覆盖哪个属性?此外,您可以将控件包装在自定义控件中,并根据需要设置属性。由于它是XAML,这是关于依赖项还是附加属性的?这是一个很好的例子,但您还需要提供更多的代码。UIElement是一个库类,所以请命名SomeProperty。然后有人可以查看规格。答案:视情况而定。@Tigran:
myusercontrolnewcontrol=newmyusercontrol()
表示我已经在xaml表单中拥有一个控件,并且我正在为MyCustomeControl创建一个新对象,并将其与我在xaml中添加的控件一起分配。也就是说,如果基本方法是虚拟的或抽象的。您应该使用“new”而不是“override”。“override”用于“virtual”属性。使用
new
关键字并不是覆盖成员,而是隐藏成员-很大的区别。而且,正如@Will在上面的评论中指出的那样,“*”这是不可取的“*常见的问题是1)基函数仍将访问基属性。2) 基类thing=新的子类();事物。年龄=2;//这对基类起作用。Age而不是ChildClass.Age我对基类没有控制权。我可以在MyUserControl类中进行更改。遗憾的是,依赖项属性(根本)没有意义。但是请注意,如果用户使用基类更改属性,则不会通知您:
((UIElement)yourControl)。Ishittevisible=false哇,这是不可取的;这是一个可怕的黑客行为。解决方法应该是不要将您的属性命名为与基类中相同的属性。@Will:我同意您的看法。这可能不是设计控件的最佳设计决策。但我故意需要重写它,因为我不是设计基类的人,在设置某个特定属性之前,我需要检查一些条件。