在C#中覆盖属性行为的最佳方法

时间:2016-08-02 06:56:13

标签: c# properties override

假设我有一个班级

public class A
{
    int foo;

    public int Foo
    {
        get {
            return foo;
        }
        set {
            if (foo == value) return;
            foo = value;
        }
    }
}

和一个班级

public class B : A
{
...
}

现在,B应该扩展属性Foo的行为。在我看来,有三种方法可以做到这一点:

方式一将在A中制作poperty virtual并在B中覆盖它。

public class A
{
    int foo;

    public virtual int Foo
    {
        get {
            return foo;
        }
        set {
            if (foo == value) return;
            foo = value;
        }
    }
}

public class B : A
{
    int foo;

    public override int Foo
    {
        get {
            return base.Foo;
        }
        set {
            base.Foo = value
            doSomething();
        }
    }

    public void doSomething() {}

}

方式二将更改A中的setter以调用虚拟方法OnFooChanged并覆盖B中的。

public class A
{
    int foo;

    public virtual int Foo
    {
        get {
            return foo;
        }
        set {
            if (foo == value) return;
            foo = value;
            OnFooChanged();
        }
    }

    protected abstract void OnFooChanged();
}

public class B : A
{
    protected override void OnFooChanged() {}
}

方式三将向A添加一个PropertyChanged事件,调用OnPropertyChanged(“Foo”),并在B中添加一个执行扩展行为的事件处理程序。

public class A
{
    int foo;

    public event PropertyChangedEventHandler PropertyChanged;

    public int Foo
    {
        get {
            return foo;
        }
        set {
            if (foo == value) return;
            foo = value;
            OnPropertyChanged("Foo");
        }
    }

    protected void OnPropertyChanged(string name)
    {
        if(PropertyChanged == null) return;
        PropertyChanged(this, PropertyChangedEventArgs(name));
    }
}

public class B : A
{
    public B()
    {
        PropertyChanged += OnPropertyChanged;
    }

    private void OnPropertyChanged(object sender, PropertyChangedEventArgs e)
    {}
}

首选哪种方式?在什么情况下?是否会对绩效产生重大影响?

0 个答案:

没有答案