c# - 包含创建实例的方法的接口(interface)

标签 c# interface design-patterns contract

我需要一个模式:

我正在使用 C#。

假设有三个 Actor ;吉姆、帕特和莎莉。 Pat 的工作是创建一个接口(interface)作为 Jim 和 Sally 之间的契约。 Sally 的工作是创建一个实现该接口(interface)的类,而 Jim 的工作是编写一个使用 Sally 的对象的类。

Jim 不应该知道 Sally 的具体对象,只知道它实现了公共(public)接口(interface)。

Pat 需要在契约(Contract)中包含一种方法,让 Jim 创建 Sally 的具体对象的实例,但作为接口(interface)引用。

没有办法在接口(interface)或抽象类中包含静态方法定义,因此您不能这样做:

public interface IFoo
{
    public static IFoo CreateIFoo();
}

Pat 如何编写合约来保证 Sally 会为 Jim 创建一个方法来创建她作为接口(interface)引用的具体对象?

最佳答案

如果可能,请求 Sally 的实例:

class Jim 
{
    public Jim(Sally sally){ /* ... */ }
}

但是,如果 Jim 需要知道何时构建 Sally,您可以传入一个委托(delegate):

class Jim
{
    private Func<Sally> _createSally.

    public Jim(Func<Sally> createSally)
    {
        _createSally = createSally;
    }

    public void ConsumeSally()
    {
        Sally sally = _createSally();
        /* ... */
    }
}

最简单的用法:

var jim = new Jim( () => new Sally() );

您不需要一个类 (Pat) 来了解如何实例化 sally,除非它确实为您的代码增加了值(value)。无论哪种方式,您可能都不希望 Jim 知道 Pat,因此如果需要 Pat,这就是您想要的:

var jim = new Jim( () => Pat.GetSally() );

关于c# - 包含创建实例的方法的接口(interface),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/17154394/

相关文章:

c# - 通过参数更新列名

c++ - 在 Linux 上的 C++ 应用程序中的 C 接口(interface)上为函数别名

javascript - 以事件驱动的方式编写异步代码

c# - NAudio ASIO 混音

c# - Linq Reverse - 它是改变变量还是复制

c# - 浮点 Div/Mul > 比 Add/Sub 慢 30 倍?

android - 从 Fragment 实现接口(interface)初始化接口(interface)

c# - 如何为调用方法制定特定顺序?

javascript - 将 HTML 元素作为参数传递给函数与使用 getElementById 获取相同元素

javascript - 用于获取执行上下文的 Node.js 编程模式