如何强制执行构建器模式(C#)中使用的第一个方法

问题描述 投票:0回答:1

我目前正在学习构建器模式,并希望需要某种方法的顺序/选项,并且主要使其在智能感知中可见,因此不(仅)在错误实现上有例外。

乍一看,使用接口时这似乎不太困难,但我无法弄清楚如何使用第一种方法来实现它,因此例如总是需要

builder.first()
,因为构建器类需要实现所有接口使这项工作有效,因此所有方法最初都是可见的。除了抛出异常之外,是否可以“强制”第一个方法?

示例:

public interface IFirst
{
    ISecond First();
}

public interface ISecond
{
    IThird Second();
}

public interface IThird
{
    int Third();
}

public class Builder : IFirst, ISecond, IThird
{
    private int _counter = 0;

    public ISecond First()
    {
        _counter++;
        return this;
    }

    public IThird Second()
    {
        _counter++;
        return this;
    }

    public int Third()
    {
        return _counter;
    }
}

public class BuilderConsumer
{
    public void Build()
    {
        var builder = new Builder();
        
        // goal
        var count = builder.First().Second().Third();

        // currently also possible
        var count2 = builder.Second().Third();
        var count3 = builder.Third();
    }
}
c# .net design-patterns interface builder
1个回答
0
投票

您需要使用接口和单独的类来引导使用代码完成您想要的构建器流程。

这是一个基于您问题中的代码的简单示例。

    public interface IFirst
    {
        ISecond First();
    }

    public interface ISecond
    {
        IThird Second();
    }

    public interface IThird
    {
        int Third();
    }

    public class Builder : IFirst
    {
        private int _counter = 0;

        public ISecond First()
        {
            _counter++;
            return new SubsequentBuilder(_counter);
        }
    }

    public class SubsequentBuilder : ISecond, IThird
    {
        private int _counter;

        public SubsequentBuilder(int counter)
        {
            _counter = counter;
        }

        public IThird Second()
        {
            _counter++;
            return this;
        }

        public int Third()
        {
            return _counter;
        }
    }

    public class BuilderConsumer
    {
        public void Build()
        {
            var builder = new Builder();

            // goal
            var count = builder.First().Second().Third();

            // no longer possible
            // var count2 = builder.Second().Third();
            // var count3 = builder.Third();
        }
    }
© www.soinside.com 2019 - 2024. All rights reserved.