【问题标题】:Changing propeprty setter behaviour from a base class从基类更改属性设置器行为
【发布时间】:2011-12-21 00:13:58
【问题描述】:

我正在使用 Telerik RadScheduleView 并将 IAppointment 类实现到我定义的子“Job”类中。 'Start' 和 'End' (DateTimes) 属性可在 IAppointment 类(我继承的)中找到。导航到“公共虚拟”方法(在 IAppointment 类中)向我显示了一个 { get;放;但我不能将其更改为,例如,在将新值设置为 Start 或 End 时显示 MessageBox。它在选项卡中显示元数据,这只是我无法编辑的内容吗?有没有办法以某种方式覆盖这个访问方法??

【问题讨论】:

  • 您是在问是否可以覆盖非虚拟基础成员?
  • 我在问是否可以定义这种类型的基类属性的访问方法的“设置”部分。
  • setget 都只是将语法糖倒在上面的方法。在这种情况下,它们会被编译为称为set_Startget_Start 等的方法。如果它们是正确的virtual,您可以覆盖它们。不应该有一个名为IAppointment,除非他们在命名时搞砸了。任何带有I 前缀的东西都应该是interface。我认为您必须查看的类是从接口派生的类,以查看该级别的属性是否为virtual

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


【解决方案1】:

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;
        }
    }
}

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

【讨论】:

  • 非常感谢伙计!!欣赏
【解决方案2】:

正如失望先生所说,我希望 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;
        }
    }
}

【讨论】:

    【解决方案3】:

    您可以在派生类中编写一个属性,该属性最终将获取和设置基类的属性,无需覆盖。

    【讨论】:

      【解决方案4】:

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

      这是你的情况吗?

      1. 有一个名为 IAppointment 的接口,它有 2 个属性,即 Start 和 End。 (http://www.telerik.com/help/wpf/t_telerik_windows_controls_scheduleview_iappointment.html)
      2. 有一个名为 AppointmentBase(或更衍生的 Appointment)的基本实现。 (http://www.telerik.com/help/wpf/t_telerik_windows_controls_scheduleview_appointmentbase.html)
      3. 您正在构建自己的类,该类继承自 AppointmentBase。
      4. 您希望 AppointmentBase.End 的设置器显示一个消息框,但您不知道如何添加此逻辑。

      那么,我有个好消息。

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

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

      【讨论】:

        猜你喜欢
        • 2014-09-10
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2023-03-29
        • 2017-09-05
        • 2018-05-12
        • 2015-02-20
        相关资源
        最近更新 更多