从基类更改属性setter行为

时间:2011-11-03 09:23:38

标签: c# .net inheritance properties base-class

我正在使用Telerik RadScheduleView并将IAppointment类实现到我定义的子'Job'类中。 '开始'和'结束'(DateTimes)属性可以在IAppointment类中找到(我继承了它)。导航到'公共虚拟'方法(在IAppointment类中)向我展示了{get;组;但是我无法改变它,例如,在设置一个新值到开始或结束时显示一个MessageBox。它在选项卡中说MetaData,这只是我无法编辑的内容吗?我有办法以某种方式覆盖这种访问方法吗?

4 个答案:

答案 0 :(得分:5)

名称IAppointment将向我表明它不是您继承的类,而是您正在实现的接口 - 但是,我不熟悉Telerik产品,它们的命名约定可能只是奇怪所以,按照你所说的面值,是的,你应该能够覆盖定义为虚拟的属性。

例如,如果我们在某处定义了以下类,但是可以访问,以便我们可以继承,并公开virtual成员:

public class A
{
    public virtual int J { get; set; }
}

然后我们可以继承和override - 我们仍然可以访问基本实现,但如果需要,还可以“注入”我们自己的实现:

public class B : A
{
    public override int J
    {
        get
        {
            return base.J;
        }
        set
        {
            base.J = value;
        }
    }
}

但我不能为我的生活想象为什么你想要从属性访问者的逻辑中显示一个消息框,并且不能强调你不应该这样做。

答案 1 :(得分:1)

正如失望先生所说,我希望IAppointment成为一个界面。

如果它确实是一个类,你可以使用new modifier并按照这一点做点什么。

public class Job : IAppointment
{    
    new public DateTime End
    {
        get
        {
            //get the value directly from the base class
            return base.End;
        }
        set
        {
            //display your messagebox here

            //then pass the value to the base class
            base.End = value;
        }
    }
}

答案 2 :(得分:0)

你可以在派生类中编写一个属性,最终得到并设置基类的属性,无需覆盖。

答案 3 :(得分:0)

首先,你的问题令人困惑。 IAppointment不是一个类,它是一个接口。

这是你的情况吗?

  1. 有一个名为IAppointment的接口,有2个属性,即Start和End。 (http://www.telerik.com/help/wpf/t_telerik_windows_controls_scheduleview_iappointment.html
  2. 有一个名为AppointmentBase的基础实现(或更多派生的约会)。 (http://www.telerik.com/help/wpf/t_telerik_windows_controls_scheduleview_appointmentbase.html)
  3. 您正在构建自己的类,该类继承自AppointmentBase。
  4. 您希望AppointmentBase.End的setter显示messageBox,但您不知道如何添加此逻辑。
  5. 在那种情况下,我有好消息。

    AppointmentBase仅服务虚拟成员,因此您可以轻松覆盖Set属性

    class Job : AppointmentBase
    {
        public override DateTime End
        {
            get { return base.End; }
            set
            {
                MessageBox.Show("Unbelievable!");
                base.End = value;
            }
        }
    }