C#继承和覆盖基本属性

jny*_*len 13 c# inheritance properties

我目前需要一个自定义ListViewItem类 - 让我们称之为MyListViewItem.它需要有一些与每个项目关联的附加数据,并在更改Checked属性时执行一些操作.我尝试了几件事,但目前相关的代码如下所示:

class MyListViewItem : ListViewItem {
    new public bool Checked {
        get {
            return base.Checked;
        }
        set {
            base.Checked = value;
            // do some other things here based on value
        }
    }
    public MyListViewItem(Object otherData) {
        // ...
    }
}
Run Code Online (Sandbox Code Playgroud)

我遇到的问题是,当我点击ListView中的项目复选框时,我的setter永远不会被调用.有谁知道我做错了什么?我知道我可以使用父ListView的ItemChecked事件,但这似乎是一个不那么干净的解决方案.(另外我实际上并没有将Object传递给构造函数,但这部分并不重要).

Qui*_*ome 18

它不起作用,因为"new"关键字不会仅仅"隐藏"它.

这意味着如果您通过MyListViewItem的类型定义调用对象实例上的Checked,您运行您的代码.但是,ListView通过ListViewItem的类型定义引用此对象,因此不会调用您的"新"方法.

"新" 不是覆盖.更好的解决方案是可能在自定义列表视图中处理代码.它真的不那么难看.


Meh*_*ari 9

new没有overridebase成员.它声明了一个具有相同名称的新方法.在VB.NET中它被称为Shadows.

实际上,new除了关闭编译器警告之外什么都不做.您未声明的成员override(并且只有在base成员为virtual或者时才能执行此操作override)将与base成员的继承树完全无关.