首页 >后端开发 >C++ >在 ICommand 实现中使用自定义委托是避免重复实例化的最佳方法吗?

在 ICommand 实现中使用自定义委托是避免重复实例化的最佳方法吗?

Barbara Streisand
Barbara Streisand原创
2025-01-20 17:21:11825浏览

Is Using Custom Delegates in an ICommand Implementation the Best Approach for Avoiding Repeated Instantiation?

MVVM 中的 ICommand 实现:避免重复实例化

问题:

为了避免重复创建 ICommand 实例,我尝试使用自定义委托来实现一个 ICommand 类。该类包含两个委托:OnExecute(void 委托,接受 object 参数)和 OnCanExecute(bool 委托,接受 object 参数)。

代码如下:

<code class="language-csharp">public class TestCommand : ICommand
{
    public delegate void ICommandOnExecute(object parameter);
    public delegate bool ICommandOnCanExecute(object parameter);

    private ICommandOnExecute _execute;
    private ICommandOnCanExecute _canExecute;

    public TestCommand(ICommandOnExecute onExecuteMethod, ICommandOnCanExecute onCanExecuteMethod)
    {
        _execute = onExecuteMethod;
        _canExecute = onCanExecuteMethod;
    }

    //...
}</code>

这种方法有效,但我对其实现的合理性以及是否存在更好的方法存疑。

解决方案:

这种方法与常用的 RelayCommand 模式非常相似,RelayCommand 是一种更成熟、更优化的解决方案。

RelayCommand 实现:

<code class="language-csharp">public class RelayCommand : ICommand
{
    private readonly Predicate<object> _canExecute;
    private readonly Action<object> _execute;

    public RelayCommand(Predicate<object> canExecute, Action<object> execute)
    {
        _canExecute = canExecute;
        _execute = execute;
    }

    //...
}</code>

使用方法:

<code class="language-csharp">public class MyViewModel
{
    private RelayCommand _doSomething;

    public ICommand DoSomethingCommand
    {
        get
        {
            return _doSomething ??= new RelayCommand(
                p => this.CanDoSomething(),
                p => this.DoSomeImportantMethod());
        }
    }
}</code>

使用 null-coalescing assignment (??=) 确保只创建一次 RelayCommand 实例。

参考:

通过使用 RelayCommand 或类似的预构建实现,可以避免自定义委托带来的额外复杂性,并获得更简洁、更可靠的代码。

以上是在 ICommand 实现中使用自定义委托是避免重复实例化的最佳方法吗?的详细内容。更多信息请关注PHP中文网其他相关文章!

声明:
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn