Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/322.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 责任链-服务1未调用服务2_C#_Chain Of Responsibility - Fatal编程技术网

C# 责任链-服务1未调用服务2

C# 责任链-服务1未调用服务2,c#,chain-of-responsibility,C#,Chain Of Responsibility,我试图通过搜索Servicer类字符串中的字符/字符串来演示责任链模式的使用。代码运行,但Servicer1 ServiceReq未调用Servicer2 ServiceReq。如果我用“g”运行这个,我只会得到“checkedservicer1'”,但我应该得到“checkedservicer1'”,请求在servicer2中找到 表格编号: namespace ChainOfResponsibility { public partial class Form1 : Form

我试图通过搜索Servicer类字符串中的字符/字符串来演示责任链模式的使用。代码运行,但Servicer1 ServiceReq未调用Servicer2 ServiceReq。如果我用“g”运行这个,我只会得到“checkedservicer1'”,但我应该得到“checkedservicer1'”,请求在servicer2中找到

表格编号:

namespace ChainOfResponsibility
{
    public partial class Form1 : Form
    {
        public Form1()
        {
            InitializeComponent();
        }

        private void button1_Click(object sender, EventArgs e)
        {
            char request = System.Convert.ToChar(textBox1.Text);
            Servicer h1 = new Servicer1();
            Servicer h2 = new Servicer2();
            h1.SetSuccessor(h2);

            AddToList(h1.ServiceReq(request));
        }
        private void AddToList(string message)
        {
            listBox1.Items.Add(message);

            listBox1.Items.Add("----------------------------------------");

            if (listBox1.Items.Count > 0)
                listBox1.TopIndex = listBox1.Items.Count - 1;
        }
    }
}

第一个问题是,您从未对
succession.ServiceReq
的返回值执行任何操作。下一个问题是,您似乎希望从
ServiceReq
返回多条消息。为此,您应该设置返回类型
IEnumerable
,并对代码进行相应的调整

以下是您将如何调整“服务者”:

抽象类服务程序
{
...
公共抽象IEnumerableServiceReq(字符请求);
}
类Servicer1:Servicer
{
公共覆盖IEnumerable ServiceReq(字符请求)
{
字符串s1=“山姆吃了坚果”;
返回“已检查服务1”;
如果(s1.包含(请求))
{
返回“在服务器1中找到请求”;
}
else if(继任者!=null)
{
产生返回继任者ServiceReq(请求);
}
}
}
//Servicer2的类似更改
以下是对您的表单代码的更改:

namespace ChainOfResponsibility
{
    public partial class Form1 : Form
    {
        ...
        private void AddToList(IEnumerable<string> messages)
        {
            listBox1.Items.AddRange(messages);

            ...
        }
    }
}
名称空间责任链
{
公共部分类Form1:Form
{
...
私有void AddToList(IEnumerable消息)
{
listBox1.Items.AddRange(消息);
...
}
}
}

如果您在文本框中输入了适当的字符,则会生成包含预期输出的列表。

请发布您尝试过的内容和预期结果您通过表单提供的输入是什么?而且,您的预期输出永远不会发生;您调用
succession.ServiceReq
,但从未对返回值执行任何操作。您调用
succession.ServiceReq(请求)但对返回的值不执行任何操作。
abstract class Servicer
{
    ...
    public abstract IEnumerable<string> ServiceReq(char request);
}

class Servicer1 : Servicer
{
    public override IEnumerable<string> ServiceReq(char request)
    {
        string s1 = "Sam ate nuts";
        yield return "Checked Servicer1";
        if (s1.Contains(request))
        {
            yield return "Request found in Servicer 1";
        }
        else if (successor != null)
        {
            yield return successor.ServiceReq(request);
        }
    }
}

// Similar changes for Servicer2
namespace ChainOfResponsibility
{
    public partial class Form1 : Form
    {
        ...
        private void AddToList(IEnumerable<string> messages)
        {
            listBox1.Items.AddRange(messages);

            ...
        }
    }
}