【问题标题】:Change Base Class Property Setter Behavior更改基类属性设置器行为
【发布时间】:2014-09-10 22:31:30
【问题描述】:

所以我有一个基类,它有一个属性ItemList

public class BaseClass {
    private List<Item> itemList;
    public List<Item> ItemList {
        set { 
            itemList = value; 
            LoadItems(); 
        }
    }
    public void LoadItems() { ... }
}

现在我有一个派生类,我想在其中更改函数LoadItems() 的行为。所以我这样做了:

public class DerivedClass {
    public new void LoadItems() { ... }
}    

但是当我设置属性ItemList 时,只调用了基础LoadItems()。反正我可以打电话给新的LoadItems()吗?

【问题讨论】:

    标签: c# inheritance properties


    【解决方案1】:

    将你的属性设为virtual,并用override而不是new标记派生类实现:Knowing When to Use Override and New Keywords (C# Programming Guide)

    public virtual List<Item> ItemList {
        set { 
            itemList = value; 
            LoadItems(); 
        }
    }
    
    public override List<Item> ItemList {
        set {
            // do something
    
            // you can also call base.ItemList
            // to get base class property implementation
        }
    }
    

    【讨论】:

    • 很好的链接!它应该可以工作,尽管覆盖 LoadItem 似乎更简单。感谢您指出 override 和 new 虽然之间的区别
    【解决方案2】:

    使用此代码:

    public class BaseClass {
        // ....
        public virtual void LoadItems() { ... }
    }
    
    public class DerivedClass : BaseClass {
        public override void LoadItems() { ... }
    } 
    

    【讨论】:

      【解决方案3】:

      LoadItems() 设为虚拟并在派生类中覆盖它:

      public class Base
      {
         public virtual void LoadItems() { ... }
      }
      
      public class Derived : Base
      {
         public override void LoadItems() { ... }
      }
      

      【讨论】:

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