C# 如何通过生成抽象类来生成程序模板

C# 如何通过生成抽象类来生成程序模板,c#,design-patterns,abstract,C#,Design Patterns,Abstract,我有以下问题 第一步是实现一个程序,该程序在启动时遵循特定的协议。 因此,onInit、onConfigRequest等功能是必需的。 (例如,通过TCP端口上的传入消息触发) 我的目标是生成一个类,例如AbstractOne,它具有抽象函数onInit(),等等。 程序员应该只继承这个基类,而只重写基类的这些抽象函数 协议的其余部分(例如)应在后台简单处理(使用基类的代码),不需要出现在程序员代码中 对于此类任务,正确的设计策略是什么?我如何处理静态main方法不可继承的问题?这个问题的关键标

我有以下问题

第一步是实现一个程序,该程序在启动时遵循特定的协议。 因此,onInit、onConfigRequest等功能是必需的。 (例如,通过TCP端口上的传入消息触发)

我的目标是生成一个类,例如AbstractOne,它具有抽象函数onInit(),等等。 程序员应该只继承这个基类,而只重写基类的这些抽象函数

协议的其余部分(例如)应在后台简单处理(使用基类的代码),不需要出现在程序员代码中

对于此类任务,正确的设计策略是什么?我如何处理静态main方法不可继承的问题?这个问题的关键标签是什么?(我在寻找解决方案时遇到问题,因为我对此问题缺乏明确的说明)

目标是创建某种类型的库/类,这些库/类包含在代码中,生成符合协议的可执行文件

编辑(新解释):

好的,让我试着更详细地解释一下:

在这种情况下,程序应该是客户机-服务器体系结构中的客户机。 我们有一个通过TCP/IP的客户机-服务器连接。在程序启动时,每个程序都需要遵循特定的协议:

一旦我的程序启动并连接到服务器,它就会收到一条Init消息(TcpClient),当这种情况发生时,它应该触发函数onInit()。 (这应该由事件系统实现吗?)在onInit()之后,应该向服务器发送确认消息。之后还有一些其他步骤,例如,来自服务器的配置消息触发onConfig等。让我们集中讨论onInit函数

这个想法是,onInit(和onConfig等)应该是程序员应该编辑的唯一函数,而整个协议消息对他来说是隐藏的。

因此,我认为在抽象类中使用抽象方法onInit()、onConfig()应该是正确的。我想隐藏的静态主类,因为在它里面,例如,将有一些部分连接到tcp端口,它对Init消息作出反应,并调用onInit函数。 这里有两个问题: 1.静态主类不能被继承,不是吗? 2.我不能从抽象主类中的主类调用抽象函数

让我举一个伪例子来说明我的想法:

 public abstract class MasterClass
{ 
    static void Main(string[] args){

         1. open TCP connection
         2. waiting for Init Message from server
         3. onInit();
         4. Send Acknowledgement, that Init Routine has ended successfully
         5. waiting for Config message from server
         6.....
    }

    public abstract void onInit();
    public abstract void onConfig();
}
我希望你现在明白了! 程序员随后应该继承这个主类,只需要编辑onInit等函数

这条路可行吗?怎么用? 对于解决这个问题,您还有什么建议

编辑:
下面提供的ideo策略很好!查看我的评论。

好吧,在选择Hg
抽象类时,您已经做出了一个很好的决定。它的好处在于,您可以定义
抽象方法
,消费者(从中继承的)必须覆盖这些方法,并且还可以使用包含代码的“普通”方法。通过这种方式,您可以为派生类型创建一个约束,以实现多个函数集,另外,还可以为它提供一组公共函数集,默认情况下,任何派生类型都将具有这些函数集。

好吧,在选择Hg
抽象类时,您已经做出了一个很好的决定。它的好处在于,您可以定义
抽象方法
,消费者(从中继承的)必须覆盖这些方法,并且还可以使用包含代码的“普通”方法。通过这种方式,您可以为派生类型创建一个约束,以实现多个函数集,另外,还可以为它提供一组公共函数集,默认情况下,任何派生类型都将具有这些函数集。

看看这个,它可能会有所帮助。下面是一个简短的代码示例:

class MainClass {
   static void Main(string[] args) {
      // Where ProcessingStrategy is your abstract class.
      // SpecificProcessingStrategy is someone else's implementation.
      //
      ProcessingStrategy strategy = new SpecificProcessingStrategy();

      // Processor is implemented and provided by you and calls the appropriate methods on the 
      // ProcessingStrategy..
      // 
      Processor processor = new Processor( strategy );
      processor.Process();
   }
}
如果您还想提供Main,那么请看一下在命令行中传入具体ProcessingStrategy(本例中为SpecificProcessingStrategy)的名称并动态加载它(我不确定如何在C中实现这一点,但我确定web上有许多示例)。

看看这个,它可能会有所帮助。下面是一个简短的代码示例:

class MainClass {
   static void Main(string[] args) {
      // Where ProcessingStrategy is your abstract class.
      // SpecificProcessingStrategy is someone else's implementation.
      //
      ProcessingStrategy strategy = new SpecificProcessingStrategy();

      // Processor is implemented and provided by you and calls the appropriate methods on the 
      // ProcessingStrategy..
      // 
      Processor processor = new Processor( strategy );
      processor.Process();
   }
}

如果您还想提供Main,那么看看在命令行中传入具体ProcessingStrategy(本例中为SpecificProcessingStrategy)的名称并动态加载它(我不确定如何在C#中实现这一点,但我确定web上有许多示例).

您所描述的是模板设计模式。您的抽象客户端包含协议细节,并通过受保护的模板/挂钩方法委托给子类,以允许Concert客户端自定义行为

// In your provided library
public abstract class Client 
{
   public void Run()
   {

      OpenConnection();

      WaitForInitMsg();

      OnInit(); // notify subclass

      SendInitAckMsg();

      WaitForConfigMsg();

      OnConfig(); // notify subclass

      SendConfigAckMsg();

      // etc, etc

   }      

   protected abstract void OnInit() {}

   protected abstract void OnConfig() {}

}

// customer/client uses the functionality like this
public class ConsoleClient : Client
{
   protected void OnInit() 
   {
      Console.WriteLine("Initialized");
   }

   protected void OnConfig() 
   {
      Console.WriteLine("Configured");
   }

}

public class MainClass 
{    
   static void Main(string[] args)    
   {
      ConsoleClient client = new ConsoleClient();
      client.Run();
   }
}

客户永远无法访问您未明确公开的Clinet对象的任何内部结构。

您所描述的是模板设计模式。您的抽象客户端包含协议细节,并通过受保护的模板/挂钩方法委托给子类,以允许Concert客户端自定义行为

// In your provided library
public abstract class Client 
{
   public void Run()
   {

      OpenConnection();

      WaitForInitMsg();

      OnInit(); // notify subclass

      SendInitAckMsg();

      WaitForConfigMsg();

      OnConfig(); // notify subclass

      SendConfigAckMsg();

      // etc, etc

   }      

   protected abstract void OnInit() {}

   protected abstract void OnConfig() {}

}

// customer/client uses the functionality like this
public class ConsoleClient : Client
{
   protected void OnInit() 
   {
      Console.WriteLine("Initialized");
   }

   protected void OnConfig() 
   {
      Console.WriteLine("Configured");
   }

}

public class MainClass 
{    
   static void Main(string[] args)    
   {
      ConsoleClient client = new ConsoleClient();
      client.Run();
   }
}

客户永远无法访问您未明确公开的Clinet对象的任何内部。

我不完全理解您的任务。请写更详细的例子说明你的目标。我不完全理解你的任务。请写更详细的例子,你的目标。谢谢。我来看看这个。这个现在可以用了!酷!尽管用户需要复制上面的main类,并将自己的特定处理策略添加到C#项目中,但仍然是这样。他是否可以编写特定的ProcessingStrategy,并使用库中提供的MainClass的主函数将其编译为可执行文件?如何做到这一点?我的目标是用户只需要实现一个类(SpecificProcessingStrategy)。当做我不知道如何从C#(最熟悉Java)的库中运行Main,但我确信这是可能的。几个