gpt4 book ai didi

c# - 实现 "Fallback"类

转载 作者:太空狗 更新时间:2023-10-29 23:11:04 28 4
gpt4 key购买 nike

我有一组类,每个类都需要在某个时候决定它们应该在内部使用两种或三种方法中的哪一种来在外部实现相同的功能。理想情况下,这应该包括回退功能,如果 ApproachA 失败,它会失败以尝试 ApproachB(可能还有方法 C、D 等)。到目前为止,我一直在使用 if (!success) { ApproachB code } 这样的编码。这样做的问题是,后来的几个方法也需要知道选择了哪种方法,并且它们都开发了自己的 if (MethodChosen) { } else { } 语句。我真的想用不那么笨拙的东西来解决这个问题……除了我考虑过的其他选项似乎都没有那么“实用”。以下是我想到的三种方法:

  1. 实现一个静态 .Create 方法来决定创建两个派生类中的哪一个,这两个类都有一个支持它们的接口(interface)。这样做的缺点是您要两次编写大量相同的代码,并且它并没有真正创建“回退”,因为它强制所有决策制定都在 .Create 方法中预先完成。这应该工作 9/10 次,但还有另外 1/10 次我希望回退仅在主要尝试失败时启动。
  2. 与上述相同,但涉及基类或抽象类,作为两者的后备类,或将主类作为回退的基类。这具有相同的回退缺点,但至少很少或没有重复代码。
  3. 使用可在运行时更改的子类实现一个正常构造的抽象类:即

    public void SomeMethodOrConstructor()
    {
    if (someConditions)
    MyChild = ChildClassA;
    else
    MyChild = ChildClassB;
    }


    public void Execute()
    {
    MyChild.Execute();
    }

选项 3 的问题是在需要时在两者之间传递数据。由于其中一些方法是对外部对象进行建模,因此这种情况会很常见。嵌套类会自动与其父类共享数据吗?还是我必须在每次通话时都传递它?

还有什么我应该考虑的吗?


更新:第一个类已启动并使用责任链运行。现在,我选择在方法执行期间不使用策略模式或回退,因为我相信它最终可能是不必要的。我认为大多数此类执行回退实际上会更好地留在他们自己的类(class)中,因为不会完全改变游戏计划,只需进行一些小调整即可。如果事实并非如此,我至少知道我现在需要调查的是什么。

感谢所有为最终解决方案提供帮助的人!

出于好奇,我的最终解决方案大致如下:

  • 创建 Handler 抽象类,与维基百科文章中概述的非常相似,但具有 public abstract Handler GetHandler() 函数,并添加其他抽象方法,如加载、保存等。
  • 为父类实现私有(private)处理程序子类(它们也可能是子类,因为它们只会处理特定类的事情……也避免了以后的命名问题)。子类在其构造函数中都采用父对象类型的参数,因此它们可以轻松访问父对象的数据。
  • 从父类的构造函数中,设置责任链处理程序/后继程序(同样,就像示例一样),然后调用 FirstHandler.GetHandler(this) 并存储结果,以便类随后知道将来使用哪个处理程序。
  • 大多数处理的方法然后简单地简化为 Handler.MethodName()

最佳答案

使用Chain of Responsibility .

chain-of-responsibility pattern is a design pattern consisting of a source of command objects and a series of processing objects. Each processing object contains a set of logic that describes the types of command objects that it can handle, and how to pass off those that it cannot handle to the next processing object in the chain. A mechanism also exists for adding new processing objects to the end of this chain.

这完全符合您需要做的事情。

关于c# - 实现 "Fallback"类,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4187529/

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