如何在与主窗体类不同的类中执行特定于函数的方法?(c#)

如何在与主窗体类不同的类中执行特定于函数的方法?(c#),c#,class,function,forms,methods,C#,Class,Function,Forms,Methods,可能是我对多态性或接口继承等一些关键编程概念缺乏认识。这应该很容易。我是个新手 我在C#程序中有一个单独的类叫做tts。现在我在其中定义了一个函数,叫做speak。这是: class tts { public void speak() { Process process1 = new Process(); process1.StartInfo.FileName = "C:\\Program Files\\eSpeak\\command

可能是我对多态性或接口继承等一些关键编程概念缺乏认识。这应该很容易。我是个新手

我在C#程序中有一个单独的类叫做tts。现在我在其中定义了一个函数,叫做speak。这是:

class tts

{ 

     public void speak() 
     {

        Process process1 = new Process();
        process1.StartInfo.FileName = "C:\\Program Files\\eSpeak\\command_line\\espeak.exe";
        process1.StartInfo.Arguments = "hello";

        process1.StartInfo.UseShellExecute = false;
        process1.StartInfo.CreateNoWindow = true;

        process1.Start();
        //process1.Kill();
    }
}
当我从事件(
listBox1\u SelectedIndexChange
)下的主窗体调用此函数时,它运行良好。这个程序所做的是每次我滚动列表框时读“你好”。但当我滚动到列表框中的下一项时,我想终止process1。当我在speak函数中实现
process1.Kill()
(通过取消Kill方法的注释)时,程序不会读取“hello”。发生的情况是进程1立即被终止。所以我不会在speak函数下实现Kill()方法。但当我更改listbox的索引(
listBox1\u SelectedIndexChange
)时,我想从主窗体中终止process1。这是我的主要表单代码

    private void listBox1_SelectedIndexChanged(object sender, EventArgs e)
    {
        tts obj = new tts();
        obj.speak();
    }
我想做的是:

    private void listBox1_SelectedIndexChanged(object sender, EventArgs e)
    {
        tts obj = new tts();
        obj.speak();
        process1.Kill();
    }
这当然不起作用,因为process1在tts类的函数speak范围内。如何从主窗体执行
process1.Kill()


我更喜欢基本代码本身,而不是关于如何操作的技术术语。

您的
Speak
方法可以返回启动的流程:

public Process Speak()
{
    // Code as before
    return process1;
}
然后你可以写:

private void listBox1_SelectedIndexChanged(object sender, EventArgs e)
{
    TextToSpeech obj = new TextToSpeech();
    Process process = obj.Speak();
    process.Kill();
}
如果您想在一个事件中启动流程,在另一个事件中终止流程,您可能需要表单中的实例变量来维护上次启动的流程:

private Process speechProcess;

private void StartButtonClicked(object sender, EventArgs e)
{
    // TODO: consider what you want to happen if there's already
    // a process running
    TextToSpeech obj = new TextToSpeech();
    speechProcess = obj.Speak();
}

private void StopButtonClicked(object sender, EventArgs e)
{
    // Possibly change the UI so that the button will be disabled
    // when there's no process running
    if (speechProcess == null)
    {
        return;
    }
    speechProcess.Kill();
    speechProcess = null;
}

编辑:如注释中所述,这将
TextToSpeech
类与使用流程的想法联系起来。如果您让
TextToSpeech
负责流程管理,则可以提供更好的封装,这样您就可以要求相应的启动和停止。然后将上面的
speechProcess
变量从
Process
类型变量更改为
TextToSpeech
,您的
Speak
方法可以返回它启动的进程:

public Process Speak()
{
    // Code as before
    return process1;
}
然后你可以写:

private void listBox1_SelectedIndexChanged(object sender, EventArgs e)
{
    TextToSpeech obj = new TextToSpeech();
    Process process = obj.Speak();
    process.Kill();
}
如果您想在一个事件中启动流程,在另一个事件中终止流程,您可能需要表单中的实例变量来维护上次启动的流程:

private Process speechProcess;

private void StartButtonClicked(object sender, EventArgs e)
{
    // TODO: consider what you want to happen if there's already
    // a process running
    TextToSpeech obj = new TextToSpeech();
    speechProcess = obj.Speak();
}

private void StopButtonClicked(object sender, EventArgs e)
{
    // Possibly change the UI so that the button will be disabled
    // when there's no process running
    if (speechProcess == null)
    {
        return;
    }
    speechProcess.Kill();
    speechProcess = null;
}

编辑:如注释中所述,这将
TextToSpeech
类与使用流程的想法联系起来。如果您让
TextToSpeech
负责流程管理,则可以提供更好的封装,这样您就可以要求相应的启动和停止。然后将上面的
speechProcess
变量从
Process
类型变量更改为
TextToSpeech

,您可以做的一件事是创建seprate类来管理流程

下面是它的示例代码:

class processmanagement
{
  Process p;

  public Process startprocess()
  {
    p = new Process();
  }

  public void killprocess(Process p1)
  {
    p = p1;
    if(p!=null)
      p.kill();
  }
}


您可以做的一件事是创建seprate类来管理流程

下面是它的示例代码:

class processmanagement
{
  Process p;

  public Process startprocess()
  {
    p = new Process();
  }

  public void killprocess(Process p1)
  {
    p = p1;
    if(p!=null)
      p.kill();
  }
}


process1
作为
tts
类的实例变量,并在那里实现方法
stopspeak
,如:

class tts {
  Process process1;
  public void speak() { .... }
  public void stopspeak() {
    if (process1 != null)
      process1.Kill();
    process1 = null;
  }
}
此外,您应该同样地在主窗口中跟踪您当前的tts类,以便编写

private tts obj;

private void listBox1_SelectedIndexChanged(object sender, EventArgs e)
{
    if (obj != null) {
      obj.stopspeak();
      obj = null;
    }
    obj = new tts();
    obj.speak();
}

process1
作为
tts
类的实例变量,并在那里实现方法
stopspeak
,如:

class tts {
  Process process1;
  public void speak() { .... }
  public void stopspeak() {
    if (process1 != null)
      process1.Kill();
    process1 = null;
  }
}
此外,您应该同样地在主窗口中跟踪您当前的tts类,以便编写

private tts obj;

private void listBox1_SelectedIndexChanged(object sender, EventArgs e)
{
    if (obj != null) {
      obj.stopspeak();
      obj = null;
    }
    obj = new tts();
    obj.speak();
}

你只比我快了一分钟:)。如果我错了,请纠正我,但我看不出
processmanagement
类有任何用处:这个类只做
Process
类本身。@MartinStettner-这是他在项目中要管理的所有流程的示例,而不是针对单个问题,我粘贴了代码,让他明白自己的工作中缺少什么design@PranayRana:您不需要任何额外的类来进行流程管理,因为
流程
类正是用于此目的的。无论您在哪里使用
processmanagement
类,您都可以以完全相同的方式使用
Process
类(即使代码更少,因为在您的情况下,您必须1)创建
processmanagement
类,2)调用
startprocess
而不是简单地创建
Process
类)。你的类只是代码重复(这被认为是糟糕的设计…。你只比我早了一分钟:)。如果我错了,请纠正我,但是我看不到
processmanagement
类的任何用途:这个类只做
Process
类本身。@MartinStettner-这是他将在项目中管理的所有流程的示例,而不是针对单个问题,我粘贴了代码,让他明白自己的工作中缺少什么design@PranayRana:您不需要任何额外的类来进行流程管理,因为
流程
类正是用于此目的的。无论您在哪里使用
processmanagement
类,您都可以以完全相同的方式使用
Process
类(即使代码更少,因为在您的情况下,您必须1)创建
processmanagement
类,2)调用
startprocess
而不是简单地创建
Process
类)。您的类只是代码重复(这被认为是糟糕的设计…)。我认为流程实例应该是
TextToSpeech
类的私有实现细节。可能有一些实现根本不使用任何外部流程。我建议将TextToSpeech实例本身作为表单的实例变量,并实现一个“StopSpeak”方法(参见下面的回答)。我认为流程实例应该是
TextToSpeech
类的私有实现细节。可能有一些实现根本不使用任何外部流程。我建议把TextToSpeech变成instanc