代码之家  ›  专栏  ›  技术社区  ›  Josh Pearce

C自定义setter事件或继承的setter

c#
  •  1
  • Josh Pearce  · 技术社区  · 15 年前

    在C语言中,有没有一种方法可以让setter从“something”继承,这样每次为特定的基类和它的继承者调用setter时,我都可以运行一些代码?

    我要做的是在我的基类上有一个名为isvalid的布尔标记。我将在验证对象后将此布尔值设置为true,然后如果在验证后调用了任何setter,我希望setter将isvalid标志更改为false。

    我不想把这个逻辑写进每一个设置器。

    7 回复  |  直到 15 年前
        1
  •  2
  •   Chris Pitman    15 年前

    你基本上是在要求一些版本的 Aspect Oriented Programming (AOP)。您有一个通用的操作,您希望在所有属性之间执行,而不需要在任何情况下实现它。

    我不确定在C中AOP的真正选择是什么,但我以前用过的是 Spring.Net AOP . 它将在动态创建的包装器中包装类,该包装器将截获对属性的所有调用,然后允许您实现一些要执行的公共逻辑。

        2
  •  3
  •   Reed Copsey    15 年前

    不,这在语言中是不可能的。

    然而,处理这种情况的一种方法是使用 INotifyPropertyChanged .如果基类指定它实现此接口,则子类还应引发PropertyChanged事件。基类可以使用它跟踪更改并验证对象。

        3
  •  2
  •   epitka    15 年前

    看看postsharp来添加这个功能,或者看看structuremap中的这个线程。 http://groups.google.com/group/structuremap-users/browse_thread/thread/fbadf4c2779ab8ed?hl=en

        4
  •  0
  •   Cecil Has a Name    15 年前

    如果所讨论的属性是虚拟的,您可以重写它们以提供通知并调用基类的实现以确保“set”通过。

        5
  •  0
  •   Guge    15 年前

    在C语言中,在每个setter中没有代码的情况下,唯一的方法是通过一个transparentproxy。它有点笨重,但它可以使编码人员看不见。

        6
  •  0
  •   Vedran    15 年前

    您可以在抽象类中创建一个虚拟方法,并从属性设置器调用它。然后可以在继承的类中重写它。

        7
  •  0
  •   Brian Rudolph    15 年前

    我经常碰到这个问题…所以我使用这样的模式:

    public class Foo
    {
       public string Bar1
       {
          get{return this._Bar1;}
          set{this.SafeSet(ref this._Bar1, value);}
       }public string _Bar1;
    
       public int Bar2
       {
          get{return this._Bar2;}
          set{this.SafeSet(ref this._Bar2, value);}
       }public int _Bar2;
    
       protected virtual SafeSet<T> (ref T local, T val)
       {
          if(local != val)
          {
             local = val;
             //whatever other post-processing you want
          }
       }
    }