gpt4 book ai didi

c# - 我将如何更改事件处理程序在继承类中的工作方式?

转载 作者:行者123 更新时间:2023-11-30 14:32:42 26 4
gpt4 key购买 nike

我正在使用一个自定义类,并有一个事件处理程序来监视属性并仅在特定情况下使用react。

这是基类的一个片段:

public class PageView
{
private UIView activePage;
public List<UIView> Pages { get; set; }
public delegate void PageChangedEventHandler(object sender, PageChangedEventArgs e);
public event PageChangedEventHandler PageChanged;

public UIView ActivePage
{
get { return activePage; }
set
{
if (!activePage.Equals(value))
{
activePage = value;
OnPageChanged();
}
}
}

protected virtual void OnPageChanged()
{
if (PageChanged != null)
PageChanged(this, new PageChangedEventArgs(Pages.IndexOf(activePage)));
}
}

这是我在子类中尝试做的事情:

public class LoopingPageView : PageView
{
protected override void OnPageChanged()
{
if (PageChanged != null &&
Pages.IndexOf(ActivePage) > 0 &&
Pages.IndexOf(ActivePage) < Pages.Count - 1)
PageChanged(this, Pages.IndexOf(ActivePage) - 1);
}
}

但是,我得到的消息是 PageChanged 只能存在于 += 或 -= 语句的左侧。处理这种情况的正确方法是什么?

最佳答案

PageChanged 是一个类似字段的事件。从声明类之外 - 即使在子类内 - 您只能使用它来订阅和取消订阅事件。

这里的解决方案通常是简单地有条件地委托(delegate)给 OnPageChanged 的基本实现:

public class LoopingPageView : PageView
{
protected override void OnPageChanged()
{
int pageIndex = Pages.IndexOf(ActivePage);
if (pageIndex > 0 && pageIndex < Pages.Count - 1)
{
base.OnPageChanged();
}
}
}

但是,在这种情况下,您还试图更改传递给处理程序的值。您无法使用当前设置执行此操作。

如果你真的需要这样做(这对我来说很奇怪,并且违反了最小惊喜原则 - 子类的行为与基类有很大不同)你应该制作 OnPageChanged() 委托(delegate)给采用页面索引(或 - PageChangedEventArgs)的重载,在这种情况下,您对 OnPageChanged() 的覆盖可以调用它不同的指数。例如:

protected virtual void OnPageChanged()
{
OnPageChanged(new PageChangedEventArgs(Pages.IndexOf(activePage));
}

// Note: this doesn't need to be virtual.
protected void OnPageChanged(PageChangedEventArgs args)
{
// Null-safe event raising
var handler = PageChanged;
if (handler != null)
{
handler(this, args);
}
}

然后在派生类中:

protected override void OnPageChanged()
{
int pageIndex = Pages.IndexOf(ActivePage);
if (pageIndex > 0 && pageIndex < Pages.Count - 1)
{
base.OnPageChanged(new PageChangedEventArgs(pageIndex - 1));
}
}

关于c# - 我将如何更改事件处理程序在继承类中的工作方式?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/18062828/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com