流畅接口实现

3
为了使我的代码更有组织性,我决定使用流畅接口;然而,在阅读可用的教程时,我发现许多实现这种流畅性的方法,其中我发现一个主题,它说要创建流畅的Interface我们应该利用Interfaces,但他没有提供任何好的细节来实现它。
以下是我如何实现流畅API的代码:
public class Person
{
    public string Name { get; private set; }
    public int Age { get; private set; }

    public static Person CreateNew()
    {
        return new Person();
    }

    public Person WithName(string name)
    {
        Name = name;
        return this;
    }

    public Person WithAge(int age)
    {
        Age = age;
        return this;
    }
}

使用代码

Person person = Person.CreateNew().WithName("John").WithAge(21);

然而,我如何更有效地使用接口来创建流畅的API呢?

这种方式有什么不够有效的吗? - Sergey Zyuzin
@Sergey,我只是想知道如何使用接口实现这样的流畅API,就像那个人所说的那样...另外,我不喜欢使用With***,而是想使用Name、Age等等...但在这种情况下,由于属性名称的原因,我无法这样做。 - Roman Ratskey
1
有提到“那个人”吗?如果能看到更大的问题就好了,因为在这种情况下,你可以简单地使用“new Person { Name="John", Age=21 }”。 - Sergey Zyuzin
在我的项目中,它会变得比这更复杂,我只是为了问题而创建了那个预览。 - Roman Ratskey
1
我认为在这篇博客中,他提供了一个非常复杂的解决方案来解决一个非常简单的问题,很抱歉。 - Sergey Zyuzin
显示剩余2条评论
1个回答

12

如果您想控制调用的顺序,使用interface实现流畅API是很好的选择。假设在您的示例中设置名称时,还要允许设置年龄。并且假设除此之外,您还需要保存这些更改,但仅在设置年龄后才保存。为了实现这一点,您需要使用接口并将它们用作返回类型。

public interface IName
{
    IAge WithName(string name);
}

public interface IAge
{
    IPersist WithAge(int age);
}

public interface IPersist
{
    void Save();
}

public class Person : IName, IAge, IPersist
{
    public string Name { get; private set; }
    public int Age { get; private set; }

    private Person(){}

    public static IName Create()
    {
         return new Person();
    }
    public IAge WithName(string name)
    {
        Name = name;
        return this;
    }

    public IPersist WithAge(int age)
    {
        Age = age;
        return this;
    }

    public void Save()
    {
        // save changes here
    }
}

但如果这种方法对你的具体情况有益/有必要,仍然要遵循这种方法。


就是这样……整洁简单。 - Roman Ratskey

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接