假设我有一个班级
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)
{}
}
首选哪种方式?在什么情况下?是否会对绩效产生重大影响?