C#继承和覆盖基本属性

时间:2009-05-13 13:53:01

标签: 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) {
        // ...
    }
}

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

5 个答案:

答案 0 :(得分:18)

它不起作用,因为“new”关键字不会仅仅“隐藏”它来覆盖它。

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

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

答案 1 :(得分:9)

newoverride成员base。它声明了一个具有相同名称的新方法。在VB.NET中,它被称为Shadows

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

答案 2 :(得分:3)

假设ListViewItemChecked属性是虚拟的,您需要覆盖它:

public override bool Checked

答案 3 :(得分:1)

ListViewItem.Checked属性不是虚拟的(请参阅MSDN doc here),因此您将无法以这种方式覆盖它的行为。您必须使用该事件或从ListView派生并覆盖ListView.OnItemChecked以更改行为。

答案 4 :(得分:1)

为什么不创建一个单独的类型来包含自定义数据,然后为每个ListViewItem Tag属性分配一个对自定义数据的引用,而不是创建自己的自定义ListViewItem?

这是我一直使用的模式,它运作良好。对于选中项目时的自定义操作,只需处理列表视图中的相关事件。